c++ 构造函数详解
c++ 构造函数详解
构造函数是干什么的
该类对象被创建的时候,编译系统对象分配内存空间,并自动调用该构造函数,由构造函数完成成员的初始化工作,故:构造函数的作用:初始化对象的数据成员
构造函数的分类
无参构造函数
带默认值的构造函数
有参(无默认值)的构造函数
复制构造函数(拷贝构造函数)
一种特殊的构造函数,当对象之间复制时会自动调用拷贝构造函数
若类中没有显示定义拷贝构造函数,则系统会自动生成默认拷贝构造函数
拷贝构造函数
拷贝构造函数是一种特殊的构造函数,具有单个形参,该形参(常用 const 修饰)是对该类型的引用。当定义一个新对象并用同一类型的对象都它进行初始化时,将显示使用拷贝构造函数,当该类型的对象传递给函数返回该类型的对象时,将隐式调用拷贝构造函数
当类中有一个数据成员是指针时,或者有成员表示在构造函数中分配的其他资源,必须显示定义拷贝构造函数
构造函数的使用情况
一个对象以值传递的方式传入函数体
一个对象以值传递的方式从函数体返回
一个对象需要通过另一个对象进行初始化
浅拷贝与深拷贝
浅拷贝
所谓浅拷贝,指的是在对象复制时,只对对象中的数据成员进行简单的赋值,默认拷贝构造函数执行的也是浅拷贝。也就是增加了一个指针,指向原来已经存在的内存。 正常情况下,“浅拷贝”已经能很好的工作,但是一旦对象存在动态成员,浅拷贝就会出问题。让我们考虑下面一段代码:
上述程序崩溃。在使用 t1 复制 t2 时,进行的是浅拷贝,只是将成员的值进行赋值。此时,t1.p = t2.p, 即两个指针指向了堆里的同一个空间。这样,析构函数会被调用两次,这就是错误出现的原因。此问题的解决方法是“深拷贝”。
深拷贝
深拷贝就是对于对象中的动态成员,并不只是简单的赋值,而是重新分配空间,即资源重新分配。上述代码处理如下:
此时 t1 与 t2 的 p 各自指向一段内存空间,但他们指向的内容相同,这就是“深拷贝”。
版权声明: 本文为 InfoQ 作者【若尘】的原创文章。
原文链接:【http://xie.infoq.cn/article/0ffb0a1bc9210bc7cb39a035e】。文章转载请联系作者。
评论