复制构造函数总结
来源:互联网 发布:好用 陶瓷 餐具 知乎 编辑:程序博客网 时间:2024/06/14 20:40
1.用同一类型的对象来初始化另一对象需要调用复制构造函数
例1:
- class A
- {
- public:
- A(){}
- A(const A& a){cout<<"copy"<<endl;}
- };
- int main()
- {
- A a, c;
- A b = a;//显式复制构造函数(1)
- c = a;//赋值函数(2)
- return 0;
- }
class A{public:A(){}A(const A& a){cout<<"copy"<<endl;}};int main(){A a, c;A b = a;//显式复制构造函数(1)c = a;//赋值函数(2)return 0;}本例要注意的是(1)和(2)的区别:
复制构造函数也是构造函数的一种。只要是构造函数,就要开辟空间。
(1)在初始化的同时还要完成开辟空间的任务,所以在复制构造函数
(2)在L9已经开辟了空间(变通构造函数),这里只是赋值
2.复制构造函数可用于传参或返回值(仅限于按值传递)
例2:
- class A
- {
- public:
- A(){}
- A(const A& a){cout<<"copy"<<endl;}
- };
- A Test(A a)
- {
- return a;
- }
- int main()
- {
- A a;
- Test(a);//调用了两次构造函数,一次传参,一次是返回值
- return 0;
- }
class A{public:A(){}A(const A& a){cout<<"copy"<<endl;}};A Test(A a){return a;}int main(){A a;Test(a);//调用了两次构造函数,一次传参,一次是返回值return 0;}
例3:
- class A
- {
- int x;
- public:
- A(int i):x(i){cout<<"construct "<<i<<endl;}
- A(const A& a){cout<<"copy"<<endl;}
- };
- int main()
- {
- list<A> a(10, 5);
- return 0;
- }
class A{int x;public:A(int i):x(i){cout<<"construct "<<i<<endl;}A(const A& a){cout<<"copy"<<endl;}};int main(){list<A> a(10, 5);return 0;}输出:
construct 5
copy
copy
copy
copy
copy
copy
copy
copy
copy
copy
先构造一个临时对象,再把它依次复制到容器中
4.根据元素初始化列表初始化数组元素时也调用复制构造函数
例:
- class A
- {
- int x;
- public:
- A(){cout<<"construct "<<endl;}
- A(int i):x(i){cout<<"construct "<<i<<endl;}
- A(const A& a){cout<<"copy"<<endl;}
- };
- int main()
- {
- cout<<"****Test1****"<<endl;
- A s1[5];
- cout<<"****Test2****"<<endl;
- A s2[5] = {1, 2, 3, 4, 5};
- cout<<"****Test3****"<<endl;
- A a(1), b(2), c(3), d(4), e(5);
- A s[5] = {a, b, c, d, e};
- return 0;
- }
class A{int x;public:A(){cout<<"construct "<<endl;}A(int i):x(i){cout<<"construct "<<i<<endl;}A(const A& a){cout<<"copy"<<endl;}};int main(){cout<<"****Test1****"<<endl;A s1[5];cout<<"****Test2****"<<endl;A s2[5] = {1, 2, 3, 4, 5};cout<<"****Test3****"<<endl;A a(1), b(2), c(3), d(4), e(5);A s[5] = {a, b, c, d, e};return 0;}输出结果:
****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类禁止复制,它的复制构造函数是私有的
- 复制构造函数总结
- 复制构造函数总结
- 复制构造函数总结
- 复制构造函数的总结
- C++笔记二:复制构造函数总结
- C++复制构造函数、const相关总结
- 构造函数 复制构造函数
- 深复制-复制构造函数
- 构造函数、复制构造函数、析构函数混合使用总结
- 构造函数/复制构造函数/析构函数/赋值操作符的总结
- C++构造函数、复制构造函数、赋值操作符、析构函数--个人总结
- 构造函数、复制构造函数和析构函数的总结
- 关于复制构造函数
- 关于复制构造函数
- 关于复制构造函数
- 关于复制构造函数
- 关于复制构造函数
- 学习复制构造函数
- 简单选择排序算法java源码
- iOS 开发--设置View的边框阴影
- ios开发者公会:87440292 欢迎广大开发朋友加入!
- vmware workstation 11.0下载和破解方法
- 【Hadoop基础教程】4、Hadoop之完全分布式环境搭建
- 复制构造函数总结
- vijos1531【noi2001】食物链
- linux下文件夹的创建、复制、剪切、重命名、清空和删除命令
- 【Jason's_ACM_解题报告】Lighting System Design
- oracle序列总结
- linux下杀死进程(kill)的N种方法
- 内连接、左外连接、右外连接、交叉连接区别
- ASP.NET的URL解密
- 数据归一化