mysql浅拷贝_c++ 拷贝构造函数(重点在内含指针的浅拷贝和深拷贝)

今天同事问了一个关于拷贝构造函数的问题,类中包含指针的情况,今天就来说说c++的拷贝构造函数。

c++的拷贝构造函数是构造函数的一种,是对类对象的初始化,拷贝构造函数只有一个参数就是本类的引用。

注意,默认构造函数(即无参构造函数)不一定存在,但是拷贝构造函数总是会存在。

下面是一个拷贝构造函数的例子。

1 #include

2 using namespacestd;3 classA{4 public:5 inta;6 A(intvalue){7 a =value;8 }9 voidshow(){10 cout<

17 A test_b(test_a);18 test_b.show();19

20 return 0;21 }

输出结果为:

10

10

如果编写了拷贝构造函数,则默认拷贝构造函数就不存在了。下面是一个非默认拷贝构造函数的例子。

1 #include

2 using namespacestd;3 classA{4 public:5 inta;6 A(intvalue){7 a =value;8 }9 A(A&tmp){10 a =tmp.a;11 cout<

21 A test_b(test_a);22 test_b.show();23

24 return 0;25 }

输出结果为:

10call copy construct10

拷贝构造函数被调用的三种情况

拷贝构造函数在以下三种情况下会被调用。

1) 当用一个对象去初始化同类的另一个对象时,会引发拷贝构造函数被调用。例如,下面的两条语句都会引发拷贝构造函数的调用,用以初始化 test_b。

1 A test_b(test_a);2 A test_b = test_a;

这两条语句是等价的。

注意,第二条语句是初始化语句,不是赋值语句。赋值语句的等号左边是一个早已有定义的变量,赋值语句不会引发拷贝构造函数的调用。例如:

1 A test_a,test_b;2 test_b = test_a;

这条语句不会引发拷贝构造函数的调用,因为  test_b  早已生成,已经初始化过了。

2) 如果函数 F 的参数是类 A 的对象,那么当 F 被调用时,类 A 的拷贝构造函数将被调用。换句话说,作为形参的对象,是用复制构造函数初始化的,而且调用拷贝构造函数时的参数,就是调用函数时所给的实参。

3) 如果函数的返冋值是类 A 的对象,则函数返冋时,类 A 的拷贝构造函数被调用。换言之,作为函数返回值的对象是用拷贝构造函数初始化 的,而调用拷贝构造函数时的实参,就是 return 语句所返回的对象。例如下面的程序:

1 #include

2 using namespacestd;3 classA{4 public:5 inta;6 A(intvalue){7 a =value;8 }9 A(A&tmp){10 a =tmp.a;11 cout<

24 return 0;25 }

输出结果:

call copy construct4

针对于第三条,有些编译器可能会有以下的结果:

4

这是因为编译器编译的时候进行了优化,函数返回值对象就不用拷贝构造函数初始化了,这其实并不符合 C++的标准。

浅拷贝和深拷贝

重头戏来了,内含指针的拷贝构造函数,C++是如何实现的呢,来看个例子:

1 #include

2 using namespacestd;3 classA{4 public:5 inta;6 int *p;7 A(int value1, intvalue2){8 a =value1;9 p = new int(value2);10 }11 ~A(){12 deletep;13 }14

15 voidshow(){16 cout<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值