C++对传参和传返回值时的优化处理

 这里先用一个例子总结构造函数和拷贝构造函数的N中调用情况,以及C++对传参和传返回值时的优化处理,再完成优化处理的一道题目。


关于对象作参数或做返回值时的传值&传引用情况

例题:

#include<iostream>
using namespace std;

class Date
{ 
public :
	Date()
	{
		cout<<"Date()" <<endl;
	}

	Date(const Date& d)
	{
		cout<<"Date(const Date& d)" <<endl;
	}

	Date& operator =(const Date& d )
	{
		cout<<"Date& operator=(const Date& d)"<< endl;
		return *this ;
	}

	~Date()
	{
		cout<<"~Date()" <<endl;
	}
};

// 1.Date 对象做参数传值 & 传引用
void fun1 (Date d) 
{}

//void fun1(Date& d)
//{}

// 2.Date 对象做返回值传值 & 传引用
Date fun2 () 
{
	Date d ;
	return d ;
} 

//Date& fun2()
//{
//	Date d ;
//	return d ;
//}

// 3.Date 对象做临时返回值传值 &传引用(编译器优化问题)
Date fun3 () 
{
	return Date ();
}

//Date& fun3()
//{
//	return Date ();
//}

void Test1()
{
	Date d1;
	fun1(d1);
}

void Test2()
{
	Date d2 = fun2();
}

void Test3()
{
	Date d3;
	d3 = fun3();
}
Test1:

  

Test2:


Test3:


由上面的分析可以得出,C++对传参和传返回值时构造的优化处理的几种情况。

总结:

       C++对传参和传返回值时构造的优化处理:                                                                                                                              a.当拷贝构造存在连续赋值的情况                                                                                          

                 b.当多个临时对象连续赋值时,即建立一个临时对象进行拷贝构造,然后又返回一个临时对象,在用这个返回的临时对象继续拷贝构造。这是,系统就会自动优化。

                 c.匿名对象的优化。

完成下面的题目

         Test1中调用了___次AA的拷贝构造函数,___次AA的赋值运算符函数的重载。

Test2中调用了___次AA的拷贝构造函数,___次AA的赋值运算符函数的重载。
Test3中调用了_次AA的拷贝构造函数,___次AA的赋值运算符函数的重载。

分析与答案:


总结:在这种题中,首先应判断分别执行了那些操作,再判断编译器在什么情况下会进行处理,最后得出结果。

 

猜你喜欢

转载自blog.csdn.net/smile_zhangw/article/details/79211649