拷贝构造函数的调用时机通常有三种
- 使用一个已经创建完成的对象来初始化一个新对象
- 以值传递的方式给函数的参数传值
- 以值的方式返回局部对象
下方所有文本均以此代码为基础
1 class Person {
2 public:
3 Person() {
4 cout << "无参构造函数" << endl;
5 mAge = 10;
6 }
7
8 Person(int age) {
9 cout << "有参构造函数" << endl;
10 mAge = age;
11 }
12 Person(const Person& p) {
13 cout << "拷贝构造函数" << endl;
14 mAge = p.mAge;
15 }
16
17 ~Person() {
18 cout << "析构函数!" << endl;
19 }
20 int mAge;
21 };
点我查看
-
使用一个已经创建完成的对象来初始化一个新对象
1 void test01(){
2 Person p1(10);//创建完的对象p1
3 Person p2(p1);//调用拷贝构造函数
4 }
注意: Person p2=p1;会调用拷贝构造函数
而Person p2;p2=p1;不会调用拷贝构造函数,为赋值操作
-
以值传递的方式给函数的参数传值
1 void doWork(Person p){
2
3 }
4
5 void test02(){
6 Person p1;//创建对象
7 doWork(p1);调用函数,并将对象p1传入
8 }
-
以值的方式返回局部对象
1 Person doWork02(){
2 Person p;
3 return p;
4 }
5
6 void test03(){
7 Person p1 = doWork02();
8 }
注意: 这种有个专门的优化,当你的函数返回一个自定义类的对象的时候,编译器可以优化掉返回这个过程,可以简单认为这期间只创建了一次对象,所以不会调用拷贝构造函数
-
全部代码
1 #include <iostream>
2 using namespace std;
3
4 class Person {
5 public:
6 Person() {
7 cout << "无参构造函数" << endl;
8 mAge = 10;
9 }
10
11 Person(int age) {
12 cout << "有参构造函数" << endl;
13 mAge = age;
14 }
15 Person(const Person& p) {
16 cout << "拷贝构造函数" << endl;
17 mAge = p.mAge;
18 }
19
20 ~Person() {
21 cout << "析构函数!" << endl;
22 }
23 int mAge;
24 };
25
26 void test01(){
27 Person p1(10);
28 Person p2;
29 p2=p1;
30
31 }
32
33 void doWork01(Person p){
34
35 }
36
37 void test02(){
38 Person p1;
39 doWork01(p1);
40 }
41
42
43 Person doWork02(){
44 Person p;
45 return p;
46 }
47 void test03(){
48 Person p1 = doWork02();
49 }
50
51
52 int main(){
53 test01();
54 test02();
55 test03();
56 }
2022-06-21 10:17:01原文链接: https://www.cnblogs.com/YuXiAba/p/16395832.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/6109
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!