Code Bye

A a(A(100)); 这个调用了哪个构造函数

class A{
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,
这只是语义上的,编译器完全可能优化掉临时对象 。

8

按理是先调用构造函数,然后调用拷贝构造函数,不过临时对象会被编译器优化了

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明A a(A(100)); 这个调用了哪个构造函数