11

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

承认以下代码:

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

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

4

4 回答 4

12

在类内部Foo(特别是),两者之间没有区别,bar即 not 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
  }
};
于 2013-04-27T22:13:28.820 回答
4

他们做同样的事情的成员。

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

于 2013-04-27T22:14:24.340 回答
0

对于我在摆弄 C/C++ 时所学到的知识,在某些东西上使用 -> 主要用于指针对象,而使用 :: 用于作为名称空间一部分的类或作为任何通用类的超类的类你包括

于 2013-04-27T22:06:50.467 回答
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
}
于 2013-04-27T22:17:20.913 回答