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

西安网站建设推荐q479185700上墙婚纱手机网站制作

西安网站建设推荐q479185700上墙,婚纱手机网站制作,爱名网做网站教程,网络科技公司图片c转换构造#xff0c;拷贝构造#xff0c;operator 一.转换构造 定义一个类 class CTest { public:int m_a;CTest(int m_a):m_a(0){} };在主函数中定义对象 CTest tes1(1); CTest tes2 5;//我们发现这种定义对象的方式不符合常理#xff0c;这里其实是发生了隐式类型转…c转换构造拷贝构造operator 一.转换构造 定义一个类 class CTest { public:int m_a;CTest(int m_a):m_a(0){} };在主函数中定义对象 CTest tes1(1); CTest tes2 5;//我们发现这种定义对象的方式不符合常理这里其实是发生了隐式类型转换用到了编译器默认的转换构造函数1.转换构造函数 转换构造函数就是可以发生隐式类型转换的构造函数 2.explicit c关键字 我们可以用这个关键字修饰构造函数禁止发生隐式类型转换必须手动显示传递 代码如下 class CTest { public:int m_a;explicit CTest(int a) :m_a(a) {} };在主函数定义对象 CTest tes2 4; //禁止隐式转换不可用CTest tes5(2);//必须显示传递二.拷贝构造 定义一个类 class CTest { public:int m_a;CTest(int a) :m_a(a) {} };在主函数中定义对象 CTest tes1(3);CTest tes2(tes1);//我们发现这种定义对象的方式不符合常理这里其实是发生了拷贝用到了编译器默认的拷贝构造函数1.拷贝构造函数 拷贝构造函数函数名为当前类名参数为 const类对象的引用 函数体代码编译器提供的函数代码不为空形参中对象的成员依次给this对象中的成员做初始化操作一旦我们手动重构了拷贝构造函数编译器就不会提供默认的拷贝构造函数了 //如下我们自己手动重构一个拷贝构造函数 CTest(CTest tes) :m_a(tes.m_a){}2.浅拷贝与深拷贝 1.浅拷贝 浅拷贝编译器默认提供的拷贝构造函数是一个浅拷贝。上面的拷贝构造函数也是一个浅拷贝 浅拷贝问题在类中存在指针成员并申请堆区空间时拷贝的构造函数只是地址之间的拷贝会导致多个对象中的指针成员指向了同一块空间在析构函数回收时同一块空间被回收多次程序异常 如下代码定义对象时就会出现问题 class CTest { public:int m_a;int* p;CTest(int a):m_a(a),p(new int(7)) {}//浅拷贝CTest(CTest tes) :m_a(tes.m_a),p(tes.p) {cout __FUNCTION__ endl;}~CTest() {delete p;p nullptr;} };这时我们就可以用深拷贝来解决这个问题 2.深拷贝 深拷贝我们需要自己手动重构拷贝构造函数 解决为当前对象中的指针单独开辟一块属于自己的空间并将值也拷贝过来,这样就不会多次回收同一块空间了问题得到了解决 代码如下 class CTest { public:int m_a;int* p;CTest(int a):m_a(a),p(new int(7)) {}//深拷贝CTest(CTest tes) :m_a(tes.m_a),p(new int(*tes.p)) {}~CTest() {delete p;p nullptr;} };3.禁止拷贝 我们在调用时函数要注意如果参数是类的对象话函数参数尽量使用引用、指针避免值传递这样就不会发生拷贝就不会出现浅拷贝问题当然如果非要用的话注意要自己重构一个拷贝构造函数—深拷贝 代码如下 void fun(CTest tes){}三.operator 定义一个类 class Ctest { public:int m_a;explicit Ctest(int a):m_a(a)){}};在主函数中定义对象 Ctest tst1(4); Ctest tst2(3); tst2 tst1; //我们发现这里不符合常理正常来说对象与对象之间不能直接用对象名赋值其实这里是用到了编译器默认的operator1.operator 函数 在空类中默认会提供下面的函数参数为const 当前类对象引用同拷贝构造一样返回类型为当前类对象的引用 编译器默认提供的这个函数函数体代码形参中对象的成员依次给this对象中的成员做赋值操作一旦我们手动重构了这个函数编译器就不会提供默认的了 我们重构一个operator 函数来模拟一下这个过程 代码如下 Ctest operator(const Ctest tst1) {this-m_a tst1.m_a;return *this; }2.浅拷贝问题 编译器默认的是浅拷贝会有浅拷贝问题 如下代码 class Ctest { public:int m_a;int* m_p nullptr;explicit Ctest(int a):m_a(a), m_p(new int(5)){}//浅拷贝Ctest operator(const Ctest tst1) {this-m_a tst1.m_a;return *this;}~Ctest() {//会回收多次相同的空间delete m_p;m_p nullptr;} };所以这里我们需要手动实现深拷贝来解决这个问题 代码如下 class Ctest { public:int m_a;int* m_p nullptr;explicit Ctest(int a):m_a(a), m_p(new int(5)){}//深拷贝Ctest operator(const Ctest tst) {if (this ! tst) {this-m_a tst.m_a;if (tst.m_p) {//将代码进行优化用三目运算符的写法代替if else的写法/*if (this-m_p) {*this-m_p *tst1.m_p;}else {this-m_p new int(*tst1.m_p);}}*///三目运算符this-m_p ? *this-m_p *tst.m_p : (this-m_p new int(*tst.m_p),0);}else {if (this-m_p) {delete m_p;m_p nullptr;}}}return *this;}~Ctest() {//会回收多次相同的空间delete m_p;m_p nullptr;} };
http://www.zqtcl.cn/news/22472/

相关文章:

  • 浙江网站建设推广公司怎样把已经有的网站做推广
  • 怎样在建设厅网站查询安全员证如何做征信公司网站
  • 网站标题空格微信营销课2013是谁讲的
  • 网站后台管理系统内容哪哪个网站可以做兼职
  • 网站网页设计的公司武威市住房和城乡建设局网站
  • 模板网站首页设计wordpress内容折叠
  • 莱芜网站优化排名it外包网
  • 永康网站建设服务wordpress调用文章分类
  • wordpress博客站模板下载某企业网站建设方案
  • 用按键精灵做网站小白怎么学室内设计
  • 企业网站建设的目的论文如何用python做一个网站
  • 网站建设的总体设计免费咨询医生软件
  • o2o商城网站系统开发手机关键词点击排名软件
  • 做网站的的步骤怎么写网站建设新趋势
  • 公司企业网站推广企业管理培训课程有哪些
  • 营销型企业网站报价网站建设提供资料
  • 大连网站建设仟亿科技郑州楼市最新消息
  • 贵州省城乡建设部官方网站厦门商务网站建设
  • 在百度里面做网站要多少钱oa办公管理系统哪个好
  • 移动互联网开发的学习心得网络营销推广优化
  • 上海老闵行网站建设南城网站优化公司
  • 免费创建网站软件wordpress stats
  • 教师招聘网站长城建设集团乔拓云智能建站官网登录入口
  • 佛山网页设计培训网站网络推广优化
  • 网站免费高清素材软件小游戏建设网站如何进行网站备案
  • 职教集团网站建设方案包装设计接单网站
  • 天津seo网站排名优化公司大连网络设计有限公司
  • 做网站大概需要多少费用长沙有什么好玩的游乐场
  • 网站栏目结构包括哪些做网站怎么用国处服务器
  • 做网站 网上接单铜陵市住房和城乡建设局网站