C++学习记录-面向对象-拷贝构造函数的调用时机

拷贝构造函数的调用时机

  • 用一个对象来初始化另一个对象
  • 将一个对象以值传递的方式作为参数传入函数中
  • 以对象作为函数的返回值的时候

示例:

1.用一个对象来初始化另一个对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class chara {
public:
string name;
public:
chara()
{
cout << "chara默认构造函数的调用" << endl;
}//默认构造函数

chara(const chara &p)
{
cout << "chara拷贝构造函数的调用" << endl;
}//拷贝构造函数
};
1
2
chara p1;
chara p2(p1);//用p1初始化p2

运行结果:

chara默认构造函数的调用
chara拷贝构造函数的调用

D:\Work\C艹练习\练手\Project1\Debug\Project1.exe (进程 5848)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

2.将一个对象以值传递的方式作为参数传入函数中

1
void test(chara p) {}
1
2
3
chara p1;
cout << endl;
test(p1);//将p1以值传递的方式传入test函数中

运行结果:

chara默认构造函数的调用

chara拷贝构造函数的调用

D:\Work\C艹练习\练手\Project1\Debug\Project1.exe (进程 26328)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

3.以对象作为函数的返回值的时候

1
chara test2(chara p) { return p; }
1
2
3
chara p1;
cout << endl;
chara p2 = test2(p1);//将p1作为参数传入test2中,以其返回值赋值给p2

运行结果:

chara默认构造函数的调用

chara拷贝构造函数的调用
chara拷贝构造函数的调用

D:\Work\C艹练习\练手\Project1\Debug\Project1.exe (进程 7516)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

注意:此处在向test2传参时p1已经拷贝,返回时就不再拷贝,最后一行是创建p2时调用的拷贝构造函数

如果将代码修改如下:

1
2
3
4
5
6
chara test(string x) 
{
chara p1;
p1.name = x;
return p1;
}
1
chara p2 = test("神里绫华");

运行结果:

chara默认构造函数的调用
chara拷贝构造函数的调用

D:\Work\C艹练习\练手\Project1\Debug\Project1.exe (进程 23496)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .