复制构造函数

来源:互联网 发布:pypi.python.org 编辑:程序博客网 时间:2024/04/29 16:23

调用构造函数进行强制类型转换:

#include<iostream>using namespace std;class A{public:int a;A(int x){a=x;cout<<"constructor!"<<endl;}/*explicit A(int x){a=x;cout<<"constructor!"<<endl;}*/ A( const A&b){a=b.a;cout<<"copy constructor!"<<endl;}void print(){cout<<a<<endl;}~A(){cout<<"disconstruct!"<<endl;}};int main(){A a(56);A b(34);b=1000;b.print();return 0;}


输出结果:

b=1000;调用构造函数创建临时对象,赋给b,然后析构。这是隐式强制类型转换,这种转换有时候会出问题,为了避免这种问题可以使用explicit关键字关闭这种特性。如上注释掉的部分。

所有的复制构造函数都只有一个参数,即该类的对象。由于复制的对象一般的不会更改,所以通常将引用定义为常量。

浅层复制构造函数:通过编译器提供的默认复制构造函数给新的对象赋值,如果是一般的成员变量是没问题的。如果是指针成员变量则可能会出错。在对指针进行赋值时两个对象的成员指针同时指向了一个内存区域,当一个对象删除后,析构函数就自动释放指针的内存区域,另一个对象的成员指针就成了一个迷途指针了。

#include<iostream>using namespace std;class A{public:int *a;void print(){cout<<*a<<endl;}A(int c){//由于a是指针所以必须开辟堆空间如果是如下//*a=c;//则会出错,因为c是局部变量,//构造函数执行完后就销毁,a就成了迷途指针a=new int(c);}/*A(const A&d){cout<<"深层复制构造函数"<<endl;a=new int;*a=*(d.a);}*/~A(){delete a;}};int main(){A *b=new A(5);A c=(*b);c.print();delete b;c.print();}


 


程序崩溃,指针b指向的内存被删除,c成了迷途指针。

为了解决浅层复制构造函数造成的迷途 指针问题我们必须自己定义复制构造函数。在函数中为指针成员函数开辟新的内存区域。例程如上,将注掉的复制构造函数添加上就ok'了。该复制构造函数就是传说中的深层复制构造函数。