我正在处理我在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 变量?
我希望这不是一个愚蠢的问题,但我想真正理解它。
和平。
答案 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)
在可能的情况下,构造函数初始化列表是最佳选择有两个原因:
const
成员,引用成员和没有默认构造函数的成员对象只能在构造函数初始化列表中初始化是。 Google for example建议使用尾随下划线命名成员变量,但m_
前缀实现了同样的目标,即保存读者查看当前范围内是否声明此变量的时间,或者是否这个变量是一个成员变量。