讨论构造拷贝构造的N种调用情况问题

来源:互联网 发布:非平衡面板数据 编辑:程序博客网 时间:2024/06/08 10:14

1.先总结C++对传参和传返回值时构造的优化处理。
1)在c++中,传参和传返回值时,如果是引用类型,则不用调用拷贝构造函数,直接返回别名。 当语句为一个表达式时,编译器会选择优化,将构造函数与拷贝构造合并。 在C++中,调用几次构造函数和拷贝构造函数,就会相应的调用几次析构函数。
2)系统在什么情况下会进行优化呢?
1>当拷贝构造存在连续的赋值情况的时候,
2>当多个临时对象连续赋值的时候
简单点来说就是,在一次拷贝构造结束后,并没有直接返回给要创建的对象而是又再次进行了拷贝构造。或者是,建立一个临时对象,来进行拷贝构造,然后又返回了一个临时对象,再用这个返回的临时对象继续拷贝构造。这时候,系统就会自动优化。
例如:
这里写图片描述
2.再完成下面的题目。
Test1中调用了2_次AA的拷贝构造函数,_1次AA的赋值运算符函数的重载。
Test2中调用了_2次AA的拷贝构造函数,_0次AA的赋值运算符函数的重载。
Test3中调用了3_次AA的拷贝构造函数,_0次AA的赋值运算符函数的重载。

class AA {}; AA f (AA a) {    return a ; } void Test1 () {    AA a1 ;    a1 = f(a1); } //Test1中,定义AA时调用了一次构造函数,a1传给f(),传参时调用了1次拷贝构造;返回临时变量a时调用了1次拷贝构造,接着调用了1次赋值运算符的重载。void Test2 () {    AA a1 ;    AA a2 = f(a1); } //Test2中,生成对象a1时调用了一次构造函数,a1传参给f()时,调用了1次拷贝构造,返回临时变量a时调用了1次拷贝构造,接着将临时变量a直接赋值给a2.void Test3 () {    AA a1 ;    AA a2 = f(f(a1)); } //Test3中,生成对象a1时调用了一次构造函数,a1传参给f()时,调用了1次拷贝构造,再返回临时变量a时调用了1次拷贝构造,将返回的临时变量作为再次调用f()时的参数,再返回临时变量a时调用了1次拷贝构造,接着用临时变量a初始化a2.

这里写图片描述
这里写图片描述
这里写图片描述