这是两个班级
class A
{
std::string s;
public:
A() { prn("A constructor"); }
A(std::string s) : s(s) { prn("A not empty constructor"); }
A(const A&) { prn("A copy constructor"); }
A& operator =(const A& a) { prn("A = operator"); return *this; }
void p() { prn("in A"); }
};
class B
{
public:
A a;
B(A aa) : a(aa) { prn("B constructor"); }
B() { prn("B default constructor"); }
};
现在,以下代码正常运行
B b(A("sa"));
b.a.p();
打印:
非空构造函数
复制构造函数
B构造函数
在A
但是如果我使用没有参数的A构造函数会发生奇怪的事情
B b(A());
编译并运行但没有输出(没有调用构造函数)
B b(A());
b.a.p(); // error here
编译错误。那么这两个构造函数之间的区别是什么?
答案 0 :(得分:5)
B b(A());
这不会声明对象。它声明了一个名为b
的函数,返回类型为B
,它接受一个返回类型为A
的函数的指针作为参数。
你想要的是:
B b = A();
或(谢谢Kerrek):
B b((A()));
或在C ++ 11中:
B b {A()};
这有时称为vexing parse。