带参数和不带参数的构造函数之间的区别

时间:2012-01-12 19:57:14

标签: c++ constructor

这是两个班级

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

编译错误。那么这两个构造函数之间的区别是什么?

1 个答案:

答案 0 :(得分:5)

B b(A());

这不会声明对象。它声明了一个名为b的函数,返回类型为B,它接受​​一个返回类型为A的函数的指针作为参数。

你想要的是:

B b = A();

或(谢谢Kerrek):

B b((A()));

或在C ++ 11中:

B b {A()};

这有时称为vexing parse