这是我在编写C ++时常常做的事情,而且我一直想知道它是一个“坏”的习惯(这种行为是标准化的吗?)
让我们说我有一节课:
Class Foo {
public:
Foo(int x) {
//this->x is the member "x" of Foo
//x is the paramater "x" to the function
this->x = x; //Sets Foo::x to x (parameter x)
}
private:
int x;
};
请注意,在Foo::Foo(int x)
中,参数名为x
,与Foo
的成员变量同名。
我通常只是使用this->x = x;
为成员变量赋值参数的值,这似乎对我有用(我通常使用MSVC)。在MSVC(和GCC我认为)中,访问x
将访问名为x
的参数,而不是名为x
的成员。这是所有c ++编译器的标准化行为吗?有没有什么能阻止编译器将x
与成员变量而不是参数变量相关联? (例如:this->x;
相当于this->x = this->x;
)
是的,使用任何兼容的编译器,参数x
将隐藏成员x
。然而,你所写的更有趣的替代方案是:
class Foo {
public:
Foo(int x) : x(x) {}
private:
int x;
};
除了不可读之外,它实际上会完全按照你的意愿行事。
我同意Rob的看法,任何符合标准的编译器都会让你做你正在做的事,但你的代码很难阅读。
命名约定非常重要。选择一个命名约定,永远不要在同一个程序中更改它。
在使用C ++进行编程时,我使用本指南:http://geosoft.no/development/cppstyle.html这是最常见的命名约定列表,每一个都包含一个简短的声明,说明为什么选择了特定的命名约定。复制此列表并根据自己的喜好自定义。
项目#11(在命名约定下)直接解决您的问题,并为您提供更好的选择。
虽然初始化列表可能是规范方法,但是分配发生的顺序不在您的控制之下。但是简单地将'm_'
或'_'
添加到您的成员中是一种方法。另一种方法是采用惯例将'_'
添加到您的参数中(如果您喜欢更清晰的成员变量声明)。像这样,
class Foo {
public:
Foo(int _x) : x(_x), y(0) {}
Foo(int _x,int_y) { x=_x; y=_y; }
private:
int x, y;
};
使用它也很有效。