class A{
public:
int v;
A(int iv=100):v(iv){…}
A(const A&){…}
A& operator=(const A& a){…}
}
运行了测试程序,发现A a(A(100));这个哪个构造函数都没调到,是什么原因 ?不是应该调用拷贝构造吗?
public:
int v;
A(int iv=100):v(iv){…}
A(const A&){…}
A& operator=(const A& a){…}
}
运行了测试程序,发现A a(A(100));这个哪个构造函数都没调到,是什么原因 ?不是应该调用拷贝构造吗?
解决方案
6
A(int iv=100)
这个构造函数肯定会调用的,没有调用拷贝构造函数,应该是被优化掉了
6
#include <iostream> using namespace std; struct A { A(int) { cout << "(int)" << endl; } A(const A &) { cout << "(const A&)" << endl; } }; int main() { A a(A(1)); }
输出
(int)
Press any key to continue . . .
这里没调拷贝构造原因是对于构造一个A的临时对象再用这个临时对象构造另一个A的对象的行为,编译器可以按部就班调用拷贝构造,也可以跳过临时对象直接构造最终的A对象。所以可能调用拷贝构造,也可能不掉用。
8
用一个类对象初始化另外一个对象的时候会调用拷贝构造函数。
例如A a(A(100));这句语义上就是先创建A(100)临时对象,再调用A的拷贝构造函数“初始化”a,
这只是语义上的,编译器完全可能优化掉临时对象 。
例如A a(A(100));这句语义上就是先创建A(100)临时对象,再调用A的拷贝构造函数“初始化”a,
这只是语义上的,编译器完全可能优化掉临时对象 。
8
按理是先调用构造函数,然后调用拷贝构造函数,不过临时对象会被编译器优化了