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

C++中拷贝构造函数的时机通常有三种情况

前置对象:

#include 
using namespace std;
class person {
public:
    person()//创建无参构造函数
	{
        cout << "构造函数调用" << endl;
    }
    
    person(int age) {
        cout << "有参构造函数的调用" << endl;
		m_age=age;
    }
	person(const person& p)
	{
		cout<<"拷贝函数的调用"<

(一)使用一个已经创建完毕的对象来初始化一个新的对象

void test01()
{
	person p1(10);
	person p2(p1);
	cout<<"p2的年龄为"<

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

(二)值传递的方式给函数参数传值

void test01(person p)//值传递,相当于person p=p
{	
}
void test02()
{
	person p1;
	test01(p1);
}

int main() {
 	test02();
    return 0;
}

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

(三)以值方式返回局部对象

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;
}

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

备注:部分编译器以值方式返回局部对象不需要调用拷贝构造函数。在这种情况下,编译器会进行优化,避免使用拷贝构造函数,而是直接将局部对象的内容移动到返回值的位置。这称为返回值优化(Return Value Optimization,RVO)直接将局部对象p1的内容移动到p2的位置,从而避免了不必要的拷贝操作。这样可以提高效率,并减少了额外的对象创建和销毁。出现以下结果:

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

之前是用VS2019的时候是能够实现的,但后续更新到VS2022的版本之后就无法实现了,这边特此马克一下

你可能感兴趣的:(#,C++核心编程,c++,开发语言,程序人生)