Подтвердить что ты не робот

Разница между этим полем и полем Class::?

Мне интересно что-то в С++.

Принятие следующего кода:

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

Внутри моего класса есть ли разница между this->bar и Foo::bar? Существуют ли случаи, когда один недействителен?

4b9b3361

Ответ 1

Внутри класса 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
  }
};

Ответ 2

Они делают те же самые элементы.

Однако вы не сможете использовать this->, чтобы отличать членов одного и того же имени в иерархии классов. Для этого вам нужно использовать версию ClassName::.

Ответ 3

Для того, что я изучил с помощью C/С++, использование → для чего-то в основном для объекта-указателя, а использование:: используется для классов, которые являются частью пространства имен или суперкласса, который является общим класс того, что вы включаете

Ответ 4

Он также позволяет вам ссылаться на переменную другого класса (базовый класс в большинстве случаев) с тем же именем. Для меня это очевидно из этого примера, надеюсь, что это поможет вам.

#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
}