C++ 中的 this->variable 和 namespace::class::variable 有什么区别?
What is the difference between this->variable and namespace::class::variable in C++?
考虑一下:
我有一个 class 带有一些私有变量和一些 public 方法,例如设置器或构造器。当我实施这些方法时,说 this->variable = 0;
或 namespace::class::variable = 0;
有什么不同吗?
在 header (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;
}
这将编译。而且在应用程序源代码中,此 class 的构造和 object 将具有两个值为 0 的变量(假设我也有一些吸气剂)。所以我的问题是:这两行代码有什么不同吗?
This will compile
spc::MyClass::variable = 0;
this->variable2 = 0;
没错!但这也会编译,产生相同的结果:
variable = 0;
variable2 = 0;
一般来说,this->
和作用域解析 ::
运算符可以让您在出现歧义时指示编译器使用哪个变量。例如,构造函数参数可能与成员变量同名:
spc::MyClass::MyClass(int variable2)
{
this->variable2 = variable2;
}
在这里,this->
的使用区分了 variable2
-the-parameter 和 variable2
-the-member of spc::MyClass
.
然而,在没有歧义的情况下,使用 "plain" 变量名对语言来说是 "idiomatic"。
注意: MyClass::something
和 this->something
之间的一个区别是什么时候是虚拟成员函数;前者会抑制虚拟调用机制,而后者不会(感谢 Sebastian Redl 的精彩评论)。
以下语句是等价的:
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;
}
this->variable
导致在当前 class.
范围内查找名称
MyClass::variable
导致在 MyClass
.
范围内查找名称
在这种情况下,当前的class是MyClass
,所以两者都相当于一个不合格的variable
。
在其他情况下,它们可能不是。例如,Base::member
可能引用基类 class 的成员,而 this->member
在派生 class 的成员函数中,可能引用派生 class 隐藏 base-class 成员。
考虑一下:
我有一个 class 带有一些私有变量和一些 public 方法,例如设置器或构造器。当我实施这些方法时,说 this->variable = 0;
或 namespace::class::variable = 0;
有什么不同吗?
在 header (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;
}
这将编译。而且在应用程序源代码中,此 class 的构造和 object 将具有两个值为 0 的变量(假设我也有一些吸气剂)。所以我的问题是:这两行代码有什么不同吗?
This will compile
spc::MyClass::variable = 0;
this->variable2 = 0;
没错!但这也会编译,产生相同的结果:
variable = 0;
variable2 = 0;
一般来说,this->
和作用域解析 ::
运算符可以让您在出现歧义时指示编译器使用哪个变量。例如,构造函数参数可能与成员变量同名:
spc::MyClass::MyClass(int variable2)
{
this->variable2 = variable2;
}
在这里,this->
的使用区分了 variable2
-the-parameter 和 variable2
-the-member of spc::MyClass
.
然而,在没有歧义的情况下,使用 "plain" 变量名对语言来说是 "idiomatic"。
注意: MyClass::something
和 this->something
之间的一个区别是什么时候是虚拟成员函数;前者会抑制虚拟调用机制,而后者不会(感谢 Sebastian Redl 的精彩评论)。
以下语句是等价的:
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;
}
this->variable
导致在当前 class.
MyClass::variable
导致在 MyClass
.
在这种情况下,当前的class是MyClass
,所以两者都相当于一个不合格的variable
。
在其他情况下,它们可能不是。例如,Base::member
可能引用基类 class 的成员,而 this->member
在派生 class 的成员函数中,可能引用派生 class 隐藏 base-class 成员。