在 c++ 中确定具有相同变量名的成员的 setter 的行为

Is the behaviour of a setter for a member with same variable name determined in c++?

本文关键字:变量名 成员 setter c++      更新时间:2023-10-16

来自python,您将使用self关键字分配成员,我想知道在不使用this关键字的情况下C++的行为会是什么,因为编译器负责分配成员。

换句话说,当我这样做时会发生什么:

class SomeClass
{
private:
    int someVariable;
public:
    void setSomeVariable(int someVariable);
};
void SomeClass::setSomeVariable(int someVariable)
{
    someVariable = someVariable;
}

由于编译器不抱怨,我想知道这是否是按照惯例为成员编写访问器的正确方法,以及行为是否确定(与例如C++中的函数参数评估不同)

在您的情况下,类成员someVariable被传递到函数中的参数遮

因此,您的代码正在执行一个微不足道的自分配:someVariable = someVariable是一个等效于someVariable的表达式。

为了消除歧义,请使用this->someVariable = someVariable;

(我承认我对类成员采用了老式的m_前缀,对静态成员采用了s_前缀。但这在最近几年已经失宠了,在Java中几乎是一种亵渎。

如果你这样做

void SomeClass::setSomeVariable(int someVariable)
{
    someVariable = someVariable;
}

参数 someVariable 将"隐藏"杆件someVariable,因此资源库失败。执行以下操作之一:

  1. 重命名参数
  2. 将命名约定应用于成员(例如 mSomeVariablesomeVariable_
  3. 用户this->someVariable

所有这些都同样有效,只是取决于个人喜好。

行为是确定的,但这不是你想要的。函数参数本身是一个变量,因此赋值:

someVariable = someVariable;

。只需将参数值设置为其当前值。要设置实例成员,请使用:

this->someVariable = someVariable;

在后一种情况下,this->限定强制在类的上下文中解析紧随其后的someVariable名称(特别是*this的类型)。在赋值的另一端,someVariable 没有以这种方式限定,因此引用了本地参数。

当然,如果实例成员没有被局部变量遮蔽,则无需用this->对其进行限定(我认为这就是您所说的"编译器负责分配成员"的意思,但这确实是错误归因;编译器只是做语言标准要求它做的事情。这是关于如何将名称解析为程序元素,而不是关于编译器对成员的任何特殊处理)。

自己一个忙,并将您的成员变量标记为成员变量,例如通过添加前缀 _ 或 m_

class SomeClass
{
private:
    int m_someVariable; // now obvious a member variable
public:
    void setSomeVariable(int someVariable);
    void aStrangeGetter(int *someVariable);
};
void SomeClass::setSomeVariable(int someVariable)
{
    m_someVariable = someVariable; // member SET (you can instantly see this)
}
void SomeClass::aStrangeGetter(int *someVariable)
{
    *someVariable = m_someVariable; // no way to be misled
}