C++中拷贝构造函数调用时机通常有三种情况
- 使用一个已经创建完毕的对象来初始化一个新对象
- 值传递的方式给函数参数传值
- 以值方式返回局部对象
示例
源代码
#include<iostream>
using namespace std;
//拷贝构造函数调用时机
class Person
{
public:
Person()//Person的默认构造
{
cout << "Person的默认构造函数调用" << endl;
}
Person(int age)//有参构造
{
m_Age = age;
cout << "Person的有参构造函数调用" << endl;
}
Person(const Person& p)//拷贝构造
{
m_Age = p.m_Age;
cout << "Person的拷贝构造函数调用" << endl;
}
~Person()//Person的析构函数
{
cout << "Person的析构函数调用" << endl;
}
//属性
int m_Age;
};
//1.使用一个已经创建完毕的对象来初始化另一个对象
void test01()
{
Person p1(20);
Person p2(p1);
cout << "p2的年龄为: " << p2.m_Age << endl;
}
//2.值传递的方式给函数参数传值
void doWork(Person p)
{
}
void test02()
{
Person p;
doWork(p);//值传递的方式会拷贝一个新的对象出来赋值给函数的形参,并不会修改实参
}
//3.值的方式返回局部对象 此方式在vs2022已经被优化,不会再拷贝一个对象返回,而是将原对象直接返回
//因为test03里面还在调用doWork2,所以不会在doWork2运行完毕之后释放,而是在test03结束后释放对象p3,也就是p
Person doWork2()
{
Person p3;//局部对象在函数执行完之后就会被释放掉
cout << (int*)&p3 << endl;
return p3;//此时返回的已经不是p3了,使用值方式进行返回,返回时会根据p3创建出一个新的对象,之后才返回
}
void test03()
{
Person p = doWork2();//在其他编译器中,创建代码行的p3和p不是一个对象,p和return行的p3是同一个
//但在vs2022中,创建代码行的p3、return行的p3,以及test03中的p都是同一个对象
cout << (int*)&p << endl;
}
int main()
{
test01();
test02();
test03();
system("pause");
return 0;
}
运行结果(vs2022平台下)