定义类构造函数

defining a class constructor

本文关键字:构造函数 定义      更新时间:2023-10-16

我正在处理我的第一堂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_xx变量呢?

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

和平。

我应该使用构造函数初始化列表还是在构造函数体中初始化?

在可能的情况下,构造函数初始化列表是最佳选择有两个原因:
  1. const成员、引用成员和没有默认构造函数的成员对象只能在构造函数初始化列表中初始化
  2. 在构造函数体中初始化的成员对象必须默认构造,然后单独初始化;这会错过优化机会,并阻止这些对象在1
  3. 中调用任何成员。

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

是的。例如,Google建议使用末尾的下划线来命名成员变量,但是m_前缀可以达到同样的目的,即节省读者查找该变量是否在当前作用域中声明的时间,或者该变量是否是成员变量的时间。

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

它们是相同的,但是在使用继承时必须使用成员列表初始化器,因此您不能在派生类的构造函数定义的主体中调用基构造函数。如:

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
};