C++一个类的默认构造函数调用另一个类的另一个默认构造函数
问题描述:
我有2个类A和B.我试图用B类的默认构造函数来调用类A的默认构造函数来初始化类A中的值B.C++一个类的默认构造函数调用另一个类的另一个默认构造函数
class A
{
A();
int x;
}
A::A()
{
//initialized x
x=10;
}
class B
{
B();
A aobj;
}
B::B()
{
//Calling class A's default constructor to initialize B's aobj.
aobj();
}
我收到了'(aobj)'的不匹配呼叫。请帮我解决。
答
其实,你并不需要显式默认构造成员,除非你明确构建成员,否则会自动发生。如果你想真正构建一个成员明确,无论是默认的建设或别的东西,你需要把你的初始化到成员初始化列表:
B::B()
: aobj() {
}
在函数体的表达aobj()
尝试使用成员aobj
上的函数调用运算符。这样做可能是合理的,例如,当aobj
是std::function<void()>
类型时。
答
在声明的上下文中,aobj()
不会尝试构造aobj
变量,而是会尝试使用运算符重载调用它operator()
。
相反,尝试在做B::B()
的初始化列表建设:
B::B() : aobj()
{
}
但是请注意,这是多余的,因为对于成员对象默认的构造函数,如果从初始化列表省略将被隐式调用。也就是说,这种构造会做同样的事情:
B::B() { }
您不是调用'A'的构造函数,而是试图调用不存在的函数调用操作符('A :: operator()()')。构造函数是未命名的特殊成员函数,不能像这样直接访问。 – 2014-10-27 15:20:45
也许你应该熟悉[成员初始值列表](http://en.cppreference.com/w/cpp/language/initializer_list)。 – Sambuca 2014-10-27 15:25:34