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

留住用户网站竹妃怎么在公众号里做网站

留住用户网站,竹妃怎么在公众号里做网站,网页设计师课程,免费申请邮箱账号c转换构造,拷贝构造,operator 一.转换构造 定义一个类 class CTest { public:int m_a;CTest(int m_a):m_a(0){} };在主函数中定义对象 CTest tes1(1); CTest tes2 5;//我们发现这种定义对象的方式不符合常理,这里其实是发生了隐式类型转…

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; //我们发现这里不符合常理,正常来说对象与对象之间不能直接用对象名赋值,其实这里是用到了编译器默认的operator=

1.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.yayakq.cn/news/735792/

相关文章:

  • 运动类网站郑州外贸网站建设公司
  • 网站优化意义回忆网站模板
  • 情侣做记录网站源码门户网站cms
  • 怎样建设淘客网站写作网站打不开
  • 重庆建设施工工程信息网厦门seo排名
  • 秦皇岛网站开发西安平面设计公司排行
  • 物理组简介 网站建设好的网站具备的条件
  • 合肥做网站的公深圳不再对抵深人员采取核查防控
  • 开发一个大型网站需要多少钱网站开发法律可行性
  • 如何替换网站ico图标ui网页设计是什么
  • 网站ui设计怎么做wordpress写文章更新失败
  • 网站制作公司 云南建设平台网站协议
  • 公司网站备案网站搭建与推广
  • 网站建设公司咨深圳少儿编程培训机构
  • 站长素材ppt模板免费下载郑州市网站空间服务公司
  • 手机在线做ppt的网站有哪些页面模板不存在怎么办
  • 网站开发流程步骤 口袋冲电气软件 网站建设
  • 网站建设公司成都案例展示洛阳建站
  • 摇一摇抽签用什么网站做地旺建设官方网站
  • 优化网站建设价格新能源汽车十大名牌
  • 好的建站网站有限责任公司和有限公司有啥区别
  • 专门做餐饮ppt的网站vps租用
  • 新校区建设网站龙山建设集团有限公司网站
  • 山东网站备案号wordpress的免费模板
  • 17网站一起做网店后台西安网络推广公司
  • 网站跳出率怎么计算北京做网站哪里好
  • 如何做好网站针对搜索引擎的seo怎么查看网站死链
  • 有什么网站可以接活做设计做期货的一般看什么网站
  • 360网站开发红叶网站开发工作室
  • 企业网站建设服务内容糕点网站策划书