C++中拷贝构造函数的时机通常有三种情况
前置对象:
#include <iostream>
using namespace std;
class person {
public:
person()//创建无参构造函数
{
cout << "构造函数调用" << endl;
}
person(int age) {
cout << "有参构造函数的调用" << endl;
m_age=age;
}
person(const person& p)
{
cout<<"拷贝函数的调用"<<endl;
m_age=p.m_age;
}
~person()//创建析构函数
{
cout<<"析构函数的调用"<<endl;
}
int m_age;
};
(一)使用一个已经创建完毕的对象来初始化一个新的对象
void test01()
{
person p1(10);
person p2(p1);
cout<<"p2的年龄为"<<p2.m_age<<endl;
}
int main() {
test01();
return 0;
}
(二)值传递的方式给函数参数传值
void test01(person p)//值传递,相当于person p=p
{
}
void test02()
{
person p1;
test01(p1);
}
int main() {
test02();
return 0;
}
(三)以值方式返回局部对象
person test01()
{
person p1;
cout << (int *)&p1 << endl;
return p1;
}
void test02()
{
person p2 = test01();
cout << (int *)&p2 << endl;
}
int main() {
test02();
system("pause");
return 0;
}
备注:部分编译器以值方式返回局部对象不需要调用拷贝构造函数。在这种情况下,编译器会进行优化,避免使用拷贝构造函数,而是直接将局部对象的内容移动到返回值的位置。这称为返回值优化(Return Value Optimization,RVO)直接将局部对象p1
的内容移动到p2
的位置,从而避免了不必要的拷贝操作。这样可以提高效率,并减少了额外的对象创建和销毁。出现以下结果:
之前是用VS2019的时候是能够实现的,但后续更新到VS2022的版本之后就无法实现了,这边特此马克一下