考虑一下:
我有一个包含一些私有变量和一些公共方法的类,例如制定者或建设者。当我实施这些方法时,说this->variable = 0;
或namespace::class::variable = 0;
会有什么不同吗?
(example.h):
namespace spc
{
class MyClass
{
public:
MyClass();
private:
int variable;
int variable2;
};
}
现在在cpp文件(example.cpp)中我有:
spc::MyClass::MyClass()
{
spc::MyClass::variable = 0;
this->variable2 = 0;
}
这将编译。而且在应用程序源代码中,此类的构造和对象将具有值为0的两个变量(假设我也有一些getter)。所以我的问题是:这两行代码是否各不相同?
答案 0 :(得分:6)
这将编译
spc::MyClass::variable = 0;
this->variable2 = 0;
那是对的!但这也会编译,产生相同的结果:
variable = 0;
variable2 = 0;
通常,this->
和范围解析::
运算符可用于指示编译器在出现歧义时使用哪个变量。例如,构造函数参数可以与成员变量同名:
spc::MyClass::MyClass(int variable2)
{
this->variable2 = variable2;
}
此处,使用this->
区分variable2
- 参数和variable2
- spc::MyClass
的成员。
然而,在没有含糊不清的情况下,使用" plain"变量名称是"惯用的"语言。
注意: MyClass::something
和this->something
之间的一个区别是什么是虚拟成员函数;前者会压制虚拟呼叫机制,而后者则不会(谢谢塞巴斯蒂安·雷德尔,以获得好评)。
答案 1 :(得分:3)
以下陈述相同:
spc::MyClass::MyClass()
{
// Very uncommon
spc::MyClass::variable = 0;
// Use this for clarity, if you feel the need
this->variable = 0;
// Short and common
variable = 0;
}
答案 2 :(得分:3)
this->variable
导致在当前类的范围内查找名称。
MyClass::variable
会导致在MyClass
范围内查找名称。
在这种情况下,当前类为MyClass
,因此两者都等同于非限定variable
。
在其他情况下,他们可能不是。例如,Base::member
可能引用基类的成员,而this->member
在派生类的成员函数中,可能引用隐藏基类的派生类的成员。构件。