这个变量>和命名空间::class::C++变量有什么区别?

What is the difference between this->variable and namespace::class::variable in C++?

本文关键字:变量 C++ class 区别 什么 命名空间 gt      更新时间:2023-10-16

考虑一下:

我有一个包含一些私有变量和一些公共方法(例如setters或构造函数)的类。当我实现这些方法时,说this->variable = 0;namespace::class::variable = 0;有什么区别吗?

在标题中(示例.h):

namespace spc
{
    class MyClass
    {
     public:
            MyClass();
     private:
            int variable;
            int variable2;
    };
}

现在在 cpp 文件(示例.cpp)中,我有:

spc::MyClass::MyClass()
{
     spc::MyClass::variable = 0;
     this->variable2 = 0;
}

这将编译。同样在应用程序源代码中,此类的构造和对象将具有值为 0 的两个变量(假设我也有一些 getter)。所以我的问题是:这两行代码与每行代码有什么不同吗?

这将编译

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的成员。

然而,在没有歧义的情况下,使用"普通"变量名对语言来说是"惯用的"。

注意: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会导致在当前类的范围内查找名称。

MyClass::variable会导致在 MyClass 的范围内查找名称。

在这种情况下,当前类是MyClass,所以两者都等价于一个不合格的variable

在其他情况下,它们可能不是。例如,Base::member可能引用基类的成员,而派生类的成员函数中的this->member可能引用隐藏基类成员的派生类的成员。