C ++中this->变量和namespace :: class :: variable有什么区别?

时间:2015-01-09 12:56:19

标签: c++ class oop namespaces this

考虑一下:

我有一个包含一些私有变量和一些公共方法的类,例如制定者或建设者。当我实施这些方法时,说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)。所以我的问题是:这两行代码是否各不相同?

3 个答案:

答案 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::somethingthis->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在派生类的成员函数中,可能引用隐藏基类的派生类的成员。构件。