构造函数与拷贝函数
构造函数、拷贝函数、深拷贝、浅拷贝、初始化列表等注意事项。
构造函数与拷贝函数
- 对于构造函数先执行初始化列表再执行构造函数的函数体,且初始化列表可以初始化const变量,而构造函数函数体不可以初始化const变量。
2.const变量声明的时候必须初始化
-
构造函数和拷贝函数在未显示定义的情况下,编译器会自动生成。且这两个函数为重载函数,即拷贝函数应该为拷贝构造函数。即拷贝函数通过拷贝的方式初始化一个新的类实例,所以构造函数和拷贝函数只执行一个!
-
编译器默认生成的拷贝构造函数,只是实现相对应的变量直接赋值
// 编译器默认生成的**拷贝函数**实现的功能
//以test2(test1);为例
a = test1.a;
prt = test1.prt;
下图表明:test2的初始化未调用构造函数,而是调用的默认拷贝构造函数,且变量的值仅是单纯的赋值,包括指针变量。指针变量的直接赋值导致了两个不同的指针变量指向了同一个地址,这就导致在test1和test2的析构函数释放类变量的时候会对同一个地址释放两次引发错误,这个就是浅拷贝引发的错误。
- 为了避免浅拷贝引发的错误,设计了深拷贝构造函数,默认的拷贝函数是浅拷贝,因此需要自己实现深拷贝构造函数。