Jul*_*ian 17 c++ variables scope class member
考虑以下课程:
class A
{
A();
int number;
void setNumber(int number);
};
Run Code Online (Sandbox Code Playgroud)
您可以通过3种方式实现'setNumber':
方法1:使用'this'指针.
void A::setNumber(int number)
{
this->number = number;
}
Run Code Online (Sandbox Code Playgroud)
方法2:使用范围解析运算符.
void A::setNumber(int number)
{
A::number = number;
}
Run Code Online (Sandbox Code Playgroud)
方法3:相反,用'm'或'_'表示所有成员变量(这是我的首选方法).
void A::setNumber(int number)
{
mNumber = number;
}
Run Code Online (Sandbox Code Playgroud)
这只是个人偏好,还是选择特定方法有好处?
小智 16
这主要是个人偏好,但让我分享我对这个问题的看法,这个问题来自同时制作许多小游戏的公司内部(因此我周围使用了很多编码风格).
这个链接有几个好的,相关的答案:为什么在C++类中使用成员变量的前缀
你的选择1:
void A::setNumber(int number)
{
this->number = number;
}
Run Code Online (Sandbox Code Playgroud)
首先,许多程序员倾向于发现这种麻烦,不断输入'this->'.其次,更重要的是,如果你的任何变量与参数或局部变量共享一个名称,一个find-replace设计说,更改'number'的名称可能会影响位于find-replace范围内的成员变量as好.
你的选择2:
void A::setNumber(int number)
{
A::number = number;
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,在大型类或具有大型函数的类中(您无法看到函数或类意外地命名),A ::(thing)的格式看起来非常像访问命名空间的一部分,因此可能会产生误导.另一个问题与上一个选项中的#2相同,如果您的名称与您正在使用的任何变量相似,则有时可能会出现意外混淆.
你的选择3:
void A::setNumber(int number)
{
mNumber = number;
}
Run Code Online (Sandbox Code Playgroud)
这是这三个选项中最好的选项.通过创建(并保持!)包含清晰且有意义的前缀的语法,您不仅可以创建本地(或全局)变量不会共享的唯一名称,而且可以立即清除声明该变量的位置,无论你发现它的上下文如何.我已经看到它像'mVariable'一样完成,就像这个'm_variable'一样,它主要取决于你是否喜欢下划线来进行大写连接.另外,如果你的风格倾向于为指针添加诸如'p'之类的东西,或者为全局变量添加'g',这种风格将很好地融合并且被读者所期待.
选项4:
void A::setNumber(int n)
{
number = n;
}
Run Code Online (Sandbox Code Playgroud)
为什么对成员和参数使用相同的名称是有好处的.没有好处可以来.当然,现在很清楚了,但是当你的方法变得很大,并且原型不再适合屏幕,并且还有一些其他开发人员编写代码时,他可能会忘记对成员进行限定.
小智 7
这是一种风格,个人偏好,或与您合作的团队或您正在与之合作的团队的老板的偏好.