复制构造函数总结
2016-06-13 00:00
246 查看
1.用同一类型的对象来初始化另一对象需要调用复制构造函数
例1:
复制构造函数也是构造函数的一种。只要是构造函数,就要开辟空间。
(1)在初始化的同时还要完成开辟空间的任务,所以在复制构造函数
(2)在L9已经开辟了空间(变通构造函数),这里只是赋值
2.复制构造函数可用于传参或返回值(仅限于按值传递)
例2:
3.复制构造函数可用于初始化顺序容器中的元素,顺序容包括vector、list、deque
例3:
construct 5
copy
copy
copy
copy
copy
copy
copy
copy
copy
copy
先构造一个临时对象,再把它依次复制到容器中
4.根据元素初始化列表初始化数组元素时也调用复制构造函数
例:
****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类禁止复制,它的复制构造函数是私有的
例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; }本例要注意的是(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; }
3.复制构造函数可用于初始化顺序容器中的元素,顺序容包括vector、list、deque
例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; }输出:
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; }输出结果:
****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类禁止复制,它的复制构造函数是私有的
相关文章推荐
- 算法导论 第10章 10.1 栈和队列
- 1.最简单的操作系统(二)makefile
- 静态库的符号解析和重定义处理策略
- 算法导论 11.1-4 大数组的直接寻址表
- 算法导论-14-1-最大重叠点
- HDOJ 2438 三分查找
- 随便记一下j
- CSMA/CD(多路访问/冲突检测)
- HDU2544用矩阵实现的Dijkstra
- 并查集
- P04: 混合三种背包问题
- 排序(理论)
- HDU1053Entropy哈夫曼求总值+优先队列
- LychrelNumber实现V2.0
- LychrelNumber题目分析
- 算法导论-12-2-基数树
- 算法导论-14-2-Josephus排列
- what is big data?
- 双向循环队列
- Linux0.12初始化程序