繁体   English   中英

定义一个类构造函数

[英]defining a 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_xx变量?

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

和平。

第一种初始化x和y的类型是在构造函数主体内,第二种是您使用的成员initializer-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
};

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

可能的话,构造器初始化器列表是最佳选择有两个原因:

  1. const成员,引用成员和没有默认构造函数的成员对象只能在构造函数初始化器列表中初始化
  2. 在构造函数的主体中初始化的成员对象必须是默认构造的,然后分别初始化。 错过了优化机会并阻止了这些对象在1中被召唤出任何成员

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM