类和对象:第二部分第三小节 拷贝构造函数的调用时机

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的版本之后就无法实现了,这边特此马克一下

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值