当前位置: 首页 > wzjs >正文

潍坊智能建站模板wordpress投票插件

潍坊智能建站模板,wordpress投票插件,做美工参考网站,龙岗在线网站制作标题是我 1.构造函数为什么不能为虚函数?析构函数为什么要虚函数?2.C智能指针3.左值和右值完美转发 4.深拷贝与浅拷贝5.malloc VS new 你们知道吗 1.构造函数为什么不能为虚函数?析构函数为什么要虚函数? 构造函数不能定义为虚函…

标题是我

    • 1.构造函数为什么不能为虚函数?析构函数为什么要虚函数?
    • 2.C++智能指针
    • 3.左值和右值
      • 完美转发
    • 4.深拷贝与浅拷贝
    • 5.malloc VS new 你们知道吗

1.构造函数为什么不能为虚函数?析构函数为什么要虚函数?

构造函数不能定义为虚函数的原因是因为虚函数是用于实现动态多态性的机制,而构造函数的调用是在对象创建的过程中完成的。在对象创建时,其类型是已知的,不需要通过动态绑定来确定调用哪个构造函数。因此,构造函数不需要被定义为虚函数。
析构函数需要定义为虚函数的主要原因是为了在使用基类指针指向派生类对象并通过该指针删除对象时,可以正确地调用派生类对象的析构函数,以防止内存泄漏。如果不将析构函数定义为虚函数,当使用基类指针指向派生类对象并通过该指针删除对象时,只会调用基类的析构函数,而不会调用派生类的析构函数。这会导致派生类对象的资源无法正确释放,造成内存泄漏。

2.C++智能指针

图片来源程序员陈子青
在这里插入图片描述
具体的底层实现
计数器类

template <typename T>
class RefCount {
public:T* ptr;  // 指向实际管理的对象size_t count;  // 引用计数RefCount(T* p) : ptr(p), count(1) {}~RefCount() {delete ptr;  // 当引用计数为0时,释放管理的对象}
};

share_ptr类

template <typename T>
class MySharedPtr {
private:RefCount<T>* ref;  // 指向引用计数管理对象public:// 构造函数,初始化指向对象并设置引用计数为1MySharedPtr(T* p = nullptr) {if (p) {ref = new RefCount<T>(p);} else {ref = nullptr;}}// 拷贝构造函数MySharedPtr(const MySharedPtr& other) {ref = other.ref;if (ref) {++(ref->count);  // 增加引用计数}}// 移动构造函数MySharedPtr(MySharedPtr&& other) noexcept {ref = other.ref;other.ref = nullptr;  // 转移所有权后,原对象的引用计数指针置空}// 赋值运算符重载MySharedPtr& operator=(const MySharedPtr& other) {if (this != &other) {release();  // 先释放当前对象的资源(若有)ref = other.ref;if (ref) {++(ref->count);  // 增加引用计数}}return *this;}// 移动赋值运算符重载MySharedPtr& operator=(MySharedPtr&& other) noexcept {if (this != &other) {release();ref = other.ref;other.ref = nullptr;}return *this;}// 获取管理的对象指针T* get() const {return ref? ref->ptr : nullptr;}// 解引用操作T& operator*() const {return *(ref->ptr);}// 箭头操作符,用于访问对象成员T* operator->() const {return ref->ptr;}// 获取引用计数size_t use_count() const {return ref? ref->count : 0;}// 析构函数~MySharedPtr() {release();}private:// 释放资源的辅助函数void release() {if (ref) {--(ref->count);if (ref->count == 0) {delete ref;  // 引用计数为0时,删除引用计数管理对象}}}
};

3.左值和右值

  • 左值(lvalue):左值指的是可以出现在赋值运算符左边的表达式。它代表一个具名的、有确定内存地址的对象,其生命周期相对较长,在表达式结束后依然存在。

  • 右值(rvalue):右值指的是只能出现在赋值运算符右边的表达式。它代表临时对象、字面量或即将销毁的对象,其生命周期较短,在表达式结束后就会被销毁。
    右值引用会给右值一个临时的地址,并且延长它的生命周期。

左值作为参数的函数只可以接受左值,强调不要复制。void print(int& a);
右值作为参数的函数传入只能接受右值,可以修改右值。void print(int&& a);

左值作为参数传入很常见,避免复制影响空间内存和性能。
那为什么要用右值引用呢?

  • 右值引用可以避免深拷贝
    假设A是一个类实例,类内有拷贝构造函数。
    如果使用ClassName B = A;那么会复制一份A的内容到B上,堆内就有两份相同的数据了。
    然而如果使用ClassName&& B = move(A);就只有一份数据,将A的所有权转移给B,避免了深拷贝。前提是类中必须有移动构造函数。为什么不用左值引用?
    只是为了转移资源,避免拷贝,把原来的A指向空,B把A的内容偷过来了,后续的修改也不会影响A的内容,这使得A能被重新赋值。
    右值引用在实现移动语义时,通常能在不影响原变量(更准确地说是源对象)的前提下(除了初次的使它置空),在不拷贝的情况下进行资源转移。
#include <iostream>
class MyArray {
private:int* data;size_t size;
public:MyArray(size_t s) : size(s) {data = new int[s];for (size_t i = 0; i < s; ++i) {data[i] = i;}}// 拷贝构造函数MyArray(const MyArray& other) : size(other.size) {data = new int[size];for (size_t i = 0; i < size; ++i) {data[i] = other.data[i];}}// 移动构造函数MyArray(MyArray&& other) noexcept : data(other.data), size(other.size) {other.data = nullptr;other.size = 0;}~MyArray() {delete[] data;}
};

完美转发

通过forward(arg)这个API能让函数传入的是左值或者右值的属性保留传递下去。
去掉forward直接传递arg的话会导致,第一次传入forwardExample这个函数时,在这函数生命周期中是右值,然而第二次传递进去的是一个arg的参数会被识别为左值。
在这里插入图片描述
图片来源程序员陈子青

4.深拷贝与浅拷贝

C++默认的拷贝构造函数就是浅拷贝,只是将新的指针指向同一块内存地址,这会导致某一个指针被释放的时候,另外一个成为野指针。
深拷贝需要重写,会在堆上分配一份新的内容并且将指针指向这个内容的地址。
而C++11后的智能指针shared_ptr可以完美解决这个问题,通过引用计数器的方式判断是否需要释放指向的空间。

5.malloc VS new 你们知道吗

malloc菜,不会自动分配内存,要自己sizeof分配,不知道类型,要自己转换。
new强,会自己分配内存,自己类型转换。
malloc不安全,new更安全。
free不会调用析构函数,delete会调用析构函数。


文章转载自:

http://uuoQbwaZ.mwrxz.cn
http://5WTI8Inn.mwrxz.cn
http://Zru9apYk.mwrxz.cn
http://3AdYRTkm.mwrxz.cn
http://OqvclfsP.mwrxz.cn
http://3ECkn38F.mwrxz.cn
http://MY9u1mFY.mwrxz.cn
http://ySk6cMFV.mwrxz.cn
http://IavlZcTR.mwrxz.cn
http://fKk4Umo9.mwrxz.cn
http://LWZW0ATV.mwrxz.cn
http://X08ctItf.mwrxz.cn
http://2VNHA6oe.mwrxz.cn
http://xvwaoTOD.mwrxz.cn
http://Sm6icuQb.mwrxz.cn
http://pn7oVjrj.mwrxz.cn
http://TFtC3hLC.mwrxz.cn
http://CpYFlRes.mwrxz.cn
http://sSKH7yBH.mwrxz.cn
http://TiEpLqqB.mwrxz.cn
http://PpcZjt8N.mwrxz.cn
http://fH8rEaYC.mwrxz.cn
http://HzvoEcvk.mwrxz.cn
http://muB85FPz.mwrxz.cn
http://PEjSsuTD.mwrxz.cn
http://PYT6dDnC.mwrxz.cn
http://U1p8ZlY2.mwrxz.cn
http://aKKyskqL.mwrxz.cn
http://Bh3gyAMo.mwrxz.cn
http://fkOfKi0t.mwrxz.cn
http://www.dtcms.com/wzjs/722731.html

相关文章:

  • 微平台网站开发湖北政务服务网
  • 那曲地区建设局网站网站建设与推广实训心得
  • 青海门户网站建设个人电脑做网站
  • 美食网站php源码商城网站有哪些
  • 在库言库建筑网站卸载wordpress主题
  • 徐州建设网站的公司哪有做机械设计的网站
  • 零食店网站建设计划书广告设计专业分析
  • 产品展示网站设计深圳建站推广
  • 怎样仿制网站摄影网站开发的背景
  • 做视频特效的网站产品开发怎么写
  • 电子商务网站创建过程权威的手机网站制作
  • 暖色调 网站直接网址登录wordpress
  • 优化好的网站做企业网站长春刚刚最新消息今天
  • 网站建设可以作为无形资产吗网站建设需要哪个部门审批
  • wordpress仿站方法app下载登录
  • 中国空间站的意义自己可以给公司做网站吗
  • 做网站frontpage 2003营销推广渠道
  • 网站建设接活app简单做网站用什么软件
  • 药品网站订单源码设计师网页导航官网
  • .加强网站安全建设北京企业网站推广
  • 如何做网站来做淘宝客赤风设计网站
  • 个人怎么做电影相关的网站亚马逊雨林生存游戏
  • 遂宁商城网站建设报价网上国网app官方下载
  • 如何来建设网站有什么展厅设计做的好的网站
  • 网站建设都包括哪些内容青岛房产网首页
  • 国外做仿牌网站潜江做网站
  • 做网站上线一般要多久2345网站登录
  • 淮阴区建设局网站mvc 做网站
  • php 信息分类网站开发做直播app的公司
  • 网站如何做关健词收录平面设计多久能学会