复制构造函数总结

来源:互联网 发布:window串口编程 编辑:程序博客网 时间:2024/06/04 20:04

转载:http://blog.csdn.net/mishifangxiangdefeng/article/details/7195369



1.用同一类型的对象来初始化另一对象需要调用复制构造函数(复制构造函数是形参为const类类型的引用的构造函数)

例1:

[cpp] view plaincopy
  1. class A  
  2. {  
  3. public:  
  4.     A(){}  
  5.     A(const A& a){cout<<"copy"<<endl;}  
  6. };  
  7. int main()  
  8. {  
  9.     A a, c;  
  10.     A b = a;//显式复制构造函数(1)  
  11.     c = a;//赋值函数(2)  
  12.     return 0;  
  13. }  
本例要注意的是(1)和(2)的区别:

复制构造函数也是构造函数的一种。只要是构造函数,就要开辟空间。

(1)在初始化的同时还要完成开辟空间的任务,所以在复制构造函数

(2)在L9已经开辟了空间(变通构造函数),这里只是赋值


2.复制构造函数可用于传参或返回值(仅限于按值传递)

例2:

[cpp] view plaincopy
  1. class A  
  2. {  
  3. public:  
  4.     A(){}  
  5.     A(const A& a){cout<<"copy"<<endl;}  
  6. };  
  7. A Test(A a)  
  8. {  
  9.     return a;  
  10. }  
  11. int main()  
  12. {  
  13.     A a;  
  14.     Test(a);//调用了两次构造函数,一次传参,一次是返回值  
  15.     return 0;  
  16. }  


3.复制构造函数可用于初始化顺序容器中的元素,顺序容包括vector、list、deque

例3:

[cpp] view plaincopy
  1. class A  
  2. {  
  3.     int x;  
  4. public:  
  5.     A(int i):x(i){cout<<"construct "<<i<<endl;}  
  6.     A(const A& a){cout<<"copy"<<endl;}  
  7. };  
  8. int main()  
  9. {  
  10.     list<A> a(10, 5);  
  11.     return 0;  
  12. }  
输出:

construct 5
copy
copy
copy
copy
copy
copy
copy
copy
copy
copy

先构造一个临时对象,再把它依次复制到容器中


4.根据元素初始化列表初始化数组元素时也调用复制构造函数

例:

[cpp] view plaincopy
  1. class A  
  2. {  
  3.     int x;  
  4. public:  
  5.     A(){cout<<"construct "<<endl;}  
  6.     A(int i):x(i){cout<<"construct "<<i<<endl;}  
  7.     A(const A& a){cout<<"copy"<<endl;}  
  8. };  
  9. int main()  
  10. {  
  11.     cout<<"****Test1****"<<endl;  
  12.     A s1[5];  
  13.     cout<<"****Test2****"<<endl;  
  14.     A s2[5] = {1, 2, 3, 4, 5};  
  15.     cout<<"****Test3****"<<endl;  
  16.     A a(1), b(2), c(3), d(4), e(5);  
  17.     A s[5] = {a, b, c, d, e};  
  18.     return 0;  
  19. }  
输出结果:

****Test1****
construct
construct
construct
construct
construct
****Test2****
construct 1
construct 2
construct 3
construct 4
construct 5
****Test3****
construct 1
construct 2
construct 3
construct 4
construct 5
copy
copy
copy
copy
copy

分析结果:

Test1:构造

Test2:构造(隐式类型转换)

Test3:L16是构造L17是复制


5.如果定义了自己的构造函数,系统还是会提供一个默认的复制构造函数

如果定义了自己的复制构造函数,系统不会提供一个默认的构造函数


6.复制构造函数的行为:依次复制每一个非static成员,只是复制内容,称为浅层复制。

如果类中有指针成员,浅层复制会出错。需要定义自己的复制构造函数,使用深层复制。


7.如果要禁止复制,可以复制构造函数声明为私有

如果连友元和成员也要禁止复制,可声明为私有,且只声明不定义。


8.iostream类禁止复制,它的复制构造函数是私有的

0 0
原创粉丝点击