这里先用一个例子总结构造函数和拷贝构造函数的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的赋值运算符函数的重载。
分析与答案:
总结:在这种题中,首先应判断分别执行了那些操作,再判断编译器在什么情况下会进行处理,最后得出结果。