定义类构造函数

时间:2016-10-30 20:16:47

标签: c++ class constructor

我正在处理我在C ++编程的第一门课程,这就是我被告知定义类构造函数的方式:

class_name(int x, int y){
    this->x=x;
    this->y=y;
  };

如果我理解正确,我在这里已经多次发现,我可以这样重写:

field(int x, int y) : m_x(x), m_y(y){};

但是有这个受保护的变量:

protected:
    int m_x, m_y;

而不是

protected:
    int x, y;

它们之间是否有任何差异,还是只是不同的写作方式?

如果是这样,为什么需要使用不同的 m_x x 变量?

我希望这不是一个愚蠢的问题,但我想真正理解它。

和平。

2 个答案:

答案 0 :(得分:1)

第一种初始化x和y在构造函数体内,第二种是你使用成员初始化列表。

它们是相同的但是在使用继承时必须使用member-list初始化程序,因此您无法在派生类的构造函数定义的主体内调用基本构造函数。例如:

class A
{
    public:
        A(int x) : _x(x){} // ok
//      A(int x) {_x = x;} ok
    protected:
        int _x;
};

class B : public A
{
    public:
    //  B(int x) {A(x);} error here
        B(int x) : A(x){} // we must use member initializer list here
};

答案 1 :(得分:1)

Q1。我应该使用构造函数initializer list还是在构造函数体中初始化?

在可能的情况下,构造函数初始化列表是最佳选择有两个原因:

  1. const成员,引用成员和没有默认构造函数的成员对象只能在构造函数初始化列表中初始化
  2. 在构造函数体中初始化的成员对象必须是默认构造的,然后单独初始化;错过了优化机会,并防止这些对象在 1
  3. 中被任何成员调出

    Q2。我应该为成员变量使用命名约定吗?

    是。 Google for example建议使用尾随下划线命名成员变量,但m_前缀实现了同样的目标,即保存读者查看当前范围内是否声明此变量的时间,或者是否这个变量是一个成员变量。