参考自http://blog.csdn.net/muzi9_17/article/details/6776061和effective c++
1.默认构造函数
只要定义了自己的构造函数,编译器就不在自动生成默认构造函数。默认构造函数的主要就是对对象的分配空间,不能进行数据的初始化。而且例如Object (void)和Object(int = 0)都是一样的默认构造函数。这种对基本类型初值的的做法声明即为默认构造函数,哪怕后者有自己定义的操作。所以要自己定义自己的构造函数以完成数据的初始化。
2.默认复制构造函数
若用户没有定义拷贝构造函数,则编译器自动添加默认拷贝构造函数(带一个该类类型的参数),称为浅拷贝.所谓浅拷贝http://blog.csdn.net/lwbeyond/article/details/6202256,指的是在对象复制时,只对对象中的数据成员进行简单的赋值,默认拷贝构造函数执行的也是浅拷贝。大多情况下“浅拷贝”已经能很好地工作了,但是一旦对象存在了动态成员,那么浅拷贝就会出问题了。若类中有动态数组等数据类型,浅拷贝就会出问题.所以复制构造函数也要自己定义。
3.copy assignment operatorl
如果自己没有定义,则也是系统自动生成,但是在进行自我赋值时候会导致两个指针指向同一个对象,在一个析构后释放内存后,另一个也随之消失。会导致问题。可以引入证同测试。但是不具备异常安全性,因为在进行动态分配内存时候,失败可能出现异常,最终对象会持有一个指针指向一块被删除的内存,这样的指针有害,无法安全进行删除。所以要类似这样,在复制this所指向东西前不要删除this。
CMyString& CMyString::operator= (const CMyString& str)
{
if(this != &str){
CMyString strTmp(str);
char* pTmp = strTmp.m_pData;
strTmp.m_pData = m_pData;
m_pData = pTmp;
}
return *this;
}//剑指offer代码 创建临时实例接着交换指针 然后退出if时候自动析构临时实例 顺便就把原实例内存释放掉 非常好
4. copy constructor和copy assignment operator的区别
http://blog.sina.com.cn/s/blog_48d4d2df010002n9.html
例如
Widget w2(w1); // invoke copy constructor w1 = w2; // invoke copy // assignment operator
Widget w3 = w2; // invoke copy constructor! |
幸运的是,拷贝构造函数很容易从拷贝赋值中区别出来。如果一个新的对象被定义(就象上面那行代码中的 w3),一个构造函数必须被调用;它不可能是一个赋值。如果没有新的对象被定义(就象上面那行 "w1 = w2" 代码中),没有构造函数能被调用,所以它就是一个赋值。