在 c++ 中确定具有相同变量名的成员的 setter 的行为
Is the behaviour of a setter for a member with same variable name determined in c++?
来自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
,因此资源库失败。执行以下操作之一:
- 重命名参数
- 将命名约定应用于成员(例如
mSomeVariable
或someVariable_
) - 用户
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
}
- 你能重载对象变量名本身返回的内容吗
- 在C/C++中将变量名定义为__00000001有什么好处吗
- C++变量名(可以将 main 声明为变量,但对于其他函数名称则不然)
- 从私有成员变量的成员方法返回unique_ptr
- 从不同C++类的成员变量访问成员函数
- C++ - 声明中变量名后面的括号
- 如何使替换 c 函数的变量名成为错误?
- 成员变量与成员函数的初始化
- 声明与 const 变量和成员函数相同的标识符
- 如何使用gmock模拟修改C++类中私有变量的成员函数
- 是否可以创建没有变量名的变量
- fstream库,试图创建一个变量名为(c++)的文件
- 一个数组C++中的消息和变量名
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- C++模板以从成员变量或成员函数中读取值
- 使用互斥锁和条件变量作为成员时如何修复"use of deleted function"?
- 数组的变量名和该数组的地址有什么区别?
- 在 c++ 中确定具有相同变量名的成员的 setter 的行为
- C++ - 在内部,在定义类的成员函数时,应该使用成员变量名还是其getter函数?
- 如何通过使用变量名访问QTabWidget类的成员选项卡