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

佛山营销型网站网站的优化

佛山营销型网站,网站的优化,河北建设厅官方网站八大员考试,dedecms网站版权信息拷贝构造函数 拷贝构造函数是一个已经存在的对象去初始化一个新的对象时,调用的函数 例如: 假设我有一个盒子,里面装了一个苹果 拷贝构造函数的特点 拷贝构造函数是构造函数的一个重载拷贝构造函数的第一个参数必须是类类型对象的引用,例如…

拷贝构造函数

拷贝构造函数是一个已经存在的对象初始化一个新的对象时,调用的函数
例如:
假设我有一个盒子,里面装了一个苹果

拷贝构造函数的特点

  • 拷贝构造函数是构造函数的一个重载
  • 拷贝构造函数的第一个参数必须是类类型对象的引用,例如一个日期类的拷贝构造:
// err: “Date”: 非法的复制构造函数: 第一个参数不应是“Date”
// Date(Date d);// 拷贝构造函数
Date(Date& d) {_year = d._year;_month = d._month;_day = d._day;
}
  • 如果使用传值调用的方式,编译器会直接报错,因为会引发无穷递归
    在这里插入图片描述

拷贝构造函数也可以有多个参数,但是第一个参数必须是类类型对象的引用,后面的参数必须要有缺省值

  • cpp规定自定义类型对象进行拷贝行为必须调用拷贝构造,所以上图的自定义类型传值传参和传值返回都会调用拷贝构造
  • 如果没有显式定义拷贝构造,编译器会默认生成拷贝构造函数 自动生成的拷贝构造对内置类型成员变量会完成浅拷贝(又叫值拷贝) 即一个字节一个字节拷贝,对自定义类型成员变量会调用它的拷贝构造

我们需要详细讲一下浅拷贝和深拷贝

浅拷贝与深拷贝

  1. 默认拷贝构造函数的行为
// 浅拷贝和深拷贝
class Stack {
public:// 没有显式写拷贝构造,默认生成的拷贝构造:Stack(Stack& ST) {_a = ST._a; // 直接复制指针地址,浅拷贝_size = ST._size;_capacity = ST._capacity;}
private:int* _a;int _size;int _capacity;
};// 假设有以下代码,其实编译器已经报错了
int main() {Stack st1;st1.Push(1);st1.Push(2);Stack st2 = st1;  // 调用默认拷贝构造函数(浅拷贝)
}
  1. 问题分析
    这是报错信息:
    ![[QQ_1742990601993.png]]

我们不管报错,来分析一下
此时,st1st2的成员变量状态如下:

  • st1._ast2._a指向同一块内存地址(浅拷贝直接复制了指针值)
  • st1._sizest2._size 相同。
  • st1._capacityst2._capacity 相同
  1. 析构时崩溃的原因
    st1st2 离开作用域时,它们的析构函数会被依次调用:
~Stack() {free(_a);  // 释放 _a 指向的数组_a = nullptr;
}

具体过程:

  • st2 先析构
    st2._a 指向的内存被释放。

  • st1 再析构
    st1._a 现在指向一块已经被释放的内存,再次调用 free() 会导致 重复释放(double free),引发程序崩溃

  1. 图解
    在这里插入图片描述

  2. ** 解决方案:深拷贝**
    Stack 类显式实现深拷贝构造函数,让每个对象拥有独立的资源:

	//1. 分配内存_a = (int*)malloc(sizeof(ST.capacity));if(_a == nullptr){perror("malloc() err");return;}	// 2. 复制数据memcpy(_a, ST._a, sizeof(int) * ST._size);// 3. 复制其他成员_size = ST._size;_capacity = ST._capacity;
}

在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定义类型是调用其拷贝构造函数完成的
6. 总结

  • 如果没有需要管理的资源,一般情况下不写拷贝构造函数默认生成的即可,例如日期类
  • 如果都是自定义类型成员,内置类型成员没有指向资源,默认生成的即可
  • 一般情况下,不用显式写析构函数,就不用写拷贝构造
  • 如果内部有指针或者一些值指向的资源,需要显式写析构释放,就要显式写构造完成深拷贝

野引用

传值返回会产生一个临时对象调用拷贝构造,传引用返回,返回的时返回对象的别名(引用),没有产生拷贝。但是如果返回对象是一个当前函数局部域的局部对象,函数结束之后就销毁了,那么使用引用返回就是有问题的,这时的引用相当于一个野引用,类似野指针。传引用返回会减少拷贝,但是一定要确保返回对象在函数结束之前还存在,才能传引用返回

// 传值返回
Date Func1() {Date tmp(2024, 7, 5);tmp.Print();return tmp;
}
// 传引用返回
Date& Func2(){Date tmp(2024, 7, 5);tmp.Print();return tmp;
}int main(){// Func返回了一个局部对象tmp的引用作为返回值// Func2函数结束,tmp对象被销毁,相当于野引用Date ret2 = Func2();ret2.Print();cout << "*******************************" << endl;Date ret1 = Func1();ret1.Print();return 0;
}

输出结果:在这里插入图片描述

运算符重载

未完待续~~


文章转载自:

http://Oij5a6LQ.Lsqnw.cn
http://tpcCE75h.Lsqnw.cn
http://V8VDYSk1.Lsqnw.cn
http://OKvvxVdR.Lsqnw.cn
http://jSX2xEba.Lsqnw.cn
http://HsQLRQeA.Lsqnw.cn
http://JZCNjNgJ.Lsqnw.cn
http://A4FMasOT.Lsqnw.cn
http://oP1lQx73.Lsqnw.cn
http://zGW6Suma.Lsqnw.cn
http://u9ixloDN.Lsqnw.cn
http://ZW3grnY3.Lsqnw.cn
http://jvNkuKaK.Lsqnw.cn
http://84wc498G.Lsqnw.cn
http://HlueDJvP.Lsqnw.cn
http://Qejd8lek.Lsqnw.cn
http://Uz8Jgq2y.Lsqnw.cn
http://gy3u6WLg.Lsqnw.cn
http://w5NyT8zk.Lsqnw.cn
http://osiKWLl7.Lsqnw.cn
http://RzYkNn8i.Lsqnw.cn
http://FURbGETl.Lsqnw.cn
http://F1KP4eIA.Lsqnw.cn
http://CPQooNWM.Lsqnw.cn
http://sdGKjK3l.Lsqnw.cn
http://SSyqM6A1.Lsqnw.cn
http://XoTiTwT2.Lsqnw.cn
http://OXpJS5Uw.Lsqnw.cn
http://sFsO6Akg.Lsqnw.cn
http://pd2zfYUc.Lsqnw.cn
http://www.dtcms.com/wzjs/775367.html

相关文章:

  • 建设银行网站官网登录入口谷歌优化技巧
  • 做简单的网站链接如何申请一个网站 新网
  • 公司建设网站费用会计怎么记红盾网官网入口
  • 中企动力 网站模板代做通一样的网站
  • 做一个展示型网站要多少钱盐山县网站建设公司
  • 深圳微信分销网站制作网站快照怎么做
  • 华侨大学英文网站建设手游免费0加盟代理
  • 柳州市建设中心网站个人网站模板王
  • 网站搭建模板素材免费软件app有哪些
  • 东昌府聊城做网站公司天河网站建设策划
  • 1688网站首页宁波网站建设公司排名
  • 小广告网站京东商城网站地址
  • 手机网站建设公司推荐网站中做背景图片位置咋写
  • 网站空间速度快90设计网首页
  • 濮阳网站建设0393seo建设工程施工合同解释一
  • 龙南县建设局网站网站意义
  • 要接入广告做啥网站展览 网站源码
  • 云服务器可以做视频网站吗自考本科含金量高吗
  • 建设企业网站专业服务怎么下载网页上的视频
  • 上海营销网站建设公司wordpress 拷贝页面
  • centos7是怎么做网站的新站如何快速收录
  • 做我的奴隶 good网站wordpress代码高亮插件
  • 网站开发框架技术ppt免费下载的网站
  • 网站建设公司推泉州网站设计制作
  • 深圳建专业网站男女做微电影网站
  • 北京手机网站建设公司排名精准营销论文
  • 建立网站的步骤有哪些全国企业营业执照查询
  • 阿里云网站建设程序富阳区住房与建设局网站
  • 建一个网站多少钱网站域名怎么查询备案价格
  • 无锡网站建设软件开发做网站想注册商标是哪一类