在下面的代码中,构造函数只在Car()执行时调用一次(即)。为什么不在Car o1(Car())语句中第二次调用它?
#include <stdio.h>
#include <iostream>
class Car
{
public :
Car()
{
std::cout << "Constructor" << '\n';
}
Car(Car &obj)
{
std::cout << "Copy constructor" << '\n';
}
};
int main()
{
Car();
Car o1(Car()); // not calling any constructor
return 0;
}
答案 0 :(得分:12)
Car o1(Car());
这声明了一个名为o1
的函数,它返回一个Car
并且接受一个参数,该参数是一个返回Car
的函数。这称为most-vexing parse。
您可以使用额外的一对括号来修复它:
Car o1((Car()));
或者在C ++ 11及更高版本中使用统一初始化:
Car o1{Car{}};
但为了使其工作,您需要将Car
构造函数的参数类型设为const Car&
,否则您将无法将临时值绑定到它。