禁止拷贝构造,禁止bug
禁止拷贝构造 , 禁止bug
文章插图
文章插图
一、前言 首先 , 我先讲讲为什么会写这篇文章;这个也是翻阅自己之前博客 , 当时看开源代码的时候 , 总是很奇怪 , 为什么有的代码中会会出现类似于Epoll( const Epoll这样的代码产生 , 当时大概查阅了一下资料 , 只是说这个代码的意思是将默认的拷贝构造函数禁止了 , 但是并没有了解到为什么这样做 , 直到前几天思考了这个问题 , 觉得有必要写下来 , 并且分享一下 , 也为自己做一个笔记 , 在今后的开发过程中 , 多留一个心眼 , 少踩一个坑~
二、拷贝构造函数我们先来认识下什么是拷贝构造函数;
拷贝构造函数是一个特殊的构造函数 , 一般只有一个参数 , 这个参数一般是用const修饰的 , 对自己类的一个引用 。
在编写程序的时候 , 如果我们没有编写拷贝构造函数 , 那么编译器会为我们自动生成一个拷贝构造函数 。
下面看一下最简单的构造函数使用吧(使用默认构造函数)
#include
我们自己编写一个简单的拷贝构造函数:
#include
结果:
文章插图
什么情况下会调用拷贝构造函数?
主要有以下几方面:
- 对象以值作为函数参数传递 代码演示: #include
using namespace std;class CTest{public: CTest(int num) { nNum = num; } CTest(const CTestcout<<"call me CTest"< nNum; } ~CTest(){}private:int nNum;};void g_Fun(CTest C){cout<<"C:nNum"< - 一个对象初始化另外一个对象 例子:(开始的案例) int main(){ CTest A; CTest B = A;return 0;}
比如:
#include using namespace std;class CTest{public:CTest(int num){nNum = num;}CTest(const CTestcout<<"call me CTest"<nNum;}~CTest(){}private:int nNum;};CTest g_fun(){CTest tmp(0);return tmp;}int main(){g_fun();return 0;}
这种形式的调用拷贝构造函数 , 根据编译器不同就会被优化 , 经过测试windows 环境下vs调式是会调用拷贝构造函数的 , 但是在linux下g++编译后 , 就进行了优化 , 直接通过堆栈返回对象 , 少调用一次拷贝构造函数 。三、禁用拷贝构造函数上面我们回顾了拷贝构造函数的概念以及会调用拷贝构造函数的场景 , 感觉并没有异常发生 , 一切都函数那么友好 , 那么顺利 , 无论使用我们编写的构造函数还是使用默认拷贝构造函数 , 那么我们看一个例子 , 也许大家会有一些思考:
看下这个案例:
#include using namespace std;class CTest{public:CTest(string arg):name(arg),pStr(new char[10]){}~CTest(){delete pStr;}private:string name;char *pStr;};int main(){CTest C("test");CTest A = C;return 0;}
- 每经18点丨美将禁止支付宝、微信支付等8个中国应用软件,外交部回应;铁路部门推出免费退票措施;违反居家隔离规定外出,大连3人被拘
- 最后4天!我国开始全面禁止美国发明,专家叹息:希望来得及
- 中国明令禁止装置卫星锅是为啥?现在才明白,原来是为我们好
- 这两种行为明令禁止!出现或将直接注销支付宝账号,你有过吗?
- 「Windows」快速禁止某个程序联网,不用第三方工具
- Spring Application实例化流程和构造方法参数
- 社区团购电商争议背后:超低价屡遭投诉,有供应商禁止供货
- 华海顺达:禁止供货针对所有社区团购,京东阿里加持的也不例外
- 经济学人全球头条:供应商禁止给社区团购平台供货,美团优选通报首个贪腐案,嫦娥五号成功进入月地转移轨道
- 放电180年,牛津电铃响了100亿次,人类却不知其电池构造