在C ++中将参数传递给基类构造函数之间的区别

时间:2017-10-03 14:14:29

标签: c++ inheritance constructor base-class

将参数传递给基类构造函数有什么区别?

  1. Dog::Dog(string input_name, int input_age) : Pet(input_name, input_age) { }
  2. Dog::Dog(string input_name, int input_age) { Pet(input_name, input_age); }

2 个答案:

答案 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 - 您无法在构造函数的主体中修改它。