禁止拷贝构造,禁止bug

禁止拷贝构造 , 禁止bug
禁止拷贝构造,禁止bug文章插图
禁止拷贝构造,禁止bug文章插图
一、前言 首先 , 我先讲讲为什么会写这篇文章;这个也是翻阅自己之前博客 , 当时看开源代码的时候 , 总是很奇怪 , 为什么有的代码中会会出现类似于Epoll( const Epoll这样的代码产生 , 当时大概查阅了一下资料 , 只是说这个代码的意思是将默认的拷贝构造函数禁止了 , 但是并没有了解到为什么这样做 , 直到前几天思考了这个问题 , 觉得有必要写下来 , 并且分享一下 , 也为自己做一个笔记 , 在今后的开发过程中 , 多留一个心眼 , 少踩一个坑~
二、拷贝构造函数我们先来认识下什么是拷贝构造函数;
拷贝构造函数是一个特殊的构造函数 , 一般只有一个参数 , 这个参数一般是用const修饰的 , 对自己类的一个引用 。
在编写程序的时候 , 如果我们没有编写拷贝构造函数 , 那么编译器会为我们自动生成一个拷贝构造函数 。
下面看一下最简单的构造函数使用吧(使用默认构造函数)
#include using namespace std;class CTest{public:CTest(){}~CTest(){}};int main(){CTest A;CTest B = A;return 0;}我们自己编写一个简单的拷贝构造函数:
#include using namespace std;class CTest{public:CTest(){}CTest(const CTest}~CTest(){}};int main(){CTest A;CTest B = A;return 0;}结果:
禁止拷贝构造,禁止bug文章插图
什么情况下会调用拷贝构造函数?
主要有以下几方面:

  • 对象以值作为函数参数传递 代码演示: #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;}


推荐阅读