this->字段和Class :: field之间的区别?

时间:2013-04-27 22:03:01

标签: c++ class pointers this scope-resolution

我想知道C ++中的一些东西。

承认以下代码:

int bar;
class Foo
{
public:
    Foo();
private:
    int bar;
};

在课堂上,this->barFoo::bar之间有什么区别吗?是否存在一个无效的情况?

4 个答案:

答案 0 :(得分:12)

内部课程Foo(具体而言)假设bar不是static,两者之间没有区别。

Foo::bar被称为成员bar的完全限定名称,并且在层次结构中可能有多个类型定义具有相同名称的成员的情况下,此表单非常有用。例如,您需要在此处写Foo::bar

class Foo
{
  public: Foo();
  protected: int bar;
};

class Baz : public Foo
{
  public: Baz();
  protected: int bar;

  void Test()
  {
      this->bar = 0; // Baz::bar
      Foo::bar = 0; // the only way to refer to Foo::bar
  }
};

答案 1 :(得分:4)

他们做同样的事情。

但是,您无法使用this->来区分类层次结构中同名的成员。您需要使用ClassName::版本来执行此操作。

答案 2 :(得分:0)

我学习了解C / C ++,使用 - > on something主要用于指针对象,using ::用于作为命名空间或超类的一部分的类,它是你所包含的任何通用类

答案 3 :(得分:0)

它还允许您引用具有相同名称的另一个类(大多数情况下是基类)的变量。对我来说,这个例子很明显,希望它对你有帮助。

#include <iostream>
using std::cout;
using std::endl;

class Base {
public:
    int bar;
    Base() : bar(1){}
};

class Derived : public Base {
public:
    int bar;

    Derived() : Base(), bar(2) {}

    void Test() {
        cout << "#1: " << bar << endl; // 2
        cout << "#2: " << this->bar << endl; // 2
        cout << "#3: " << Base::bar << endl; // 1
        cout << "#4: " << this->Base::bar << endl; // 1
        cout << "#5: " << this->Derived::bar << endl; // 2
    }
};

int main()
{
    Derived test;
    test.Test();
}

这是因为存储在类中的真实数据是这样的:

struct {
    Base::bar = 1;
    Derived::bar = 2; // The same as using bar
}