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(*)()
)。