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::somethingthis->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 成员。