c++ 构造函数

参考自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" 代码中),没有构造函数能被调用,所以它就是一个赋值。
所以应该尽量用自定义构造函数初始化,或者用复制构造函数初始化,因为copy assignment operater 可能要调用一次构造,一次operator。
原文地址:https://www.cnblogs.com/fengzheng1112/p/4769856.html