将参数传递给基类构造函数有什么区别?
Dog::Dog(string input_name, int input_age) : Pet(input_name, input_age) { }
Dog::Dog(string input_name, int input_age) { Pet(input_name, input_age); }
答案 0 :(得分:1)
查看以下代码段:
class Cat {
private:
const int m_legs;
public:
Cat() : m_legs{4}
{
}
};
在上面的代码段中,这是初始化常量的唯一方法,因为m_legs
在构造函数体之前初始化为。
另一个案例是exeptions管理:
class Test {
private:
ICanThrow m_throw;
public:
Cat() try : m_throw{}
{
}
catch(...)
{
// mangage exception
}
};
我通常更喜欢在ctor体之前初始化成员,或者我可以直接在类声明中初始化成员:
class Cat {
public:
void meow()
{
}
private:
const int m_legs = 4;
string m_meow{"meow"};
};
答案 1 :(得分:0)
如果Pet
没有默认构造函数,则只有1)可以工作。
当你进入构造函数的实际主体时,所有成员和基础已经构建完成。因此,如果基类没有默认构造函数,您需要告诉编译器您希望它初始化的构造函数,并在构造函数的主体之前执行 - 这就是初始化列表的用途。
另一个原因是如果基数或成员是const
- 您无法在构造函数的主体中修改它。