Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带参数和不带参数的构造函数之间的差异_C++_Constructor - Fatal编程技术网

C++ 带参数和不带参数的构造函数之间的差异

C++ 带参数和不带参数的构造函数之间的差异,c++,constructor,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

这里有两门课

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构造函数
在一个

但是如果我使用一个没有参数的构造函数,就会发生一些奇怪的事情

B b(A());
编译并运行,但没有输出(没有调用构造函数)

出现编译错误。那么这两个构造函数之间有什么区别呢

B b(A());
这不会声明对象。它声明了一个名为
b
的函数,返回类型为
b
,该函数将指向返回类型为
a
的函数的指针作为参数

你想要的是:

B b = A();
或者(谢谢Kerrek):

或者在C++11中:

B b {A()};
这有时被称为一种新方法

这不会声明对象。它声明了一个名为
b
的函数,返回类型为
b
,该函数将指向返回类型为
a
的函数的指针作为参数

你想要的是:

B b = A();
或者(谢谢Kerrek):

或者在C++11中:

B b {A()};

这有时被称为a。

您没有调用任何构造函数,即使您可能认为自己调用了;B(a);这和预期的一样好。你提到的是函数decl而不是对象decl。你没有调用任何构造函数,尽管你可能认为你调用了。我认为你应该像调用A一样;B(a);这和预期的一样好。您提到的是函数decl而不是对象decl就可以了。A从未伤害过任何人。;-]而且,更一致的C++11版本是
bb{a{}。谢谢。知道了。B=A();如果B()被声明为显式,则不起作用。但是B((A());在这两种情况下都可以正常工作。编译错误应该表明您声明了
b
作为函数,而不是类实例。Mine(G++)给出:
请求b中的成员a,这是非类类型b(a(*)()
就可以了。A从未伤害过任何人。;-]而且,更一致的C++11版本是
bb{a{}。谢谢。知道了。B=A();如果B()被声明为显式,则不起作用。但是B((A());在这两种情况下都可以正常工作。编译错误应该表明您声明了
b
作为函数,而不是类实例。Mine(G++)给出了:
对b中的成员a的请求,该成员属于非类类型b(a(*)()
)。