use*_*797 6 c++ default-constructor initialization-list
假设我有一个没有默认构造函数的类A,一个返回类型A的对象的工厂方法factoryA,以及一个以A作为其成员的类B. 我知道在这种情况下,B类型A的成员必须在B的构造函数初始化列表中初始化.我并不完全清楚为什么如果有人可以向我解释这将是伟大的.另外,如果A的构造函数的参数需要在B的构造函数内部计算,比如通过查询数据库或那种性质的东西,该怎么办?有没有办法使用下面的设置,而不提供A与默认构造函数?提前致谢.
class A {
private:
int _i;
public:
A(int i) : _i(i) {}
};
A factoryA(bool b) {
if(b)
return A(1);
else return A(2);
}
class B {
private:
A _a;
public:
B(int j) {
if(j > 0)
_a = factoryA(true);
else _a = factoryA(false);
}
};
Run Code Online (Sandbox Code Playgroud)
在进入构造函数的主体(花括号之间的部分)之前,始终会初始化成员对象.如果您没有在初始化列表中提及成员,则会默认构造它.所以提一下吧!
B::B(int j) : _a(factoryA(0 < j)) { };
Run Code Online (Sandbox Code Playgroud)
如果大于0 则调用factoryA具有参数值的函数,否则,使用该调用返回的值初始化该成员.truejfalse_a
小智 6
我并不完全清楚为什么如果有人可以向我解释这将是伟大的.
对于类[*],_a = factoryA(true);行调用_a.operator=(factoryA(true)).调用成员函数_a需要_a已经初始化.因此,如果它不是编译时错误,它仍然无效.
另外,如果A的构造函数的参数需要在B的构造函数内部计算,比如通过查询数据库或那种性质的东西,该怎么办?有没有办法使用下面的设置,而不提供A与默认构造函数?
只要A有一个复制或移动构造函数,就可以使用函数返回值对其进行初始化,并且该函数可以执行任何您想要的操作,甚至可以A根据提供的参数使用不同的构造函数.
class B {
private:
A _a;
static A getA(int i);
public:
B(int j) : _a(getA(j)) {
}
};
A B::getA(int j)
{
if (j > 0)
return factoryA(true);
else
return factoryA(false);
}
Run Code Online (Sandbox Code Playgroud)
[*]我知道,也有例外.
| 归档时间: |
|
| 查看次数: |
9353 次 |
| 最近记录: |