Разница между этим-> gt; field и Class :: field?

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

Допуская следующий код:

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

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

11

Решение

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

Другие решения

Они делают то же самое, участники.

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

4

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

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
}
0
По вопросам рекламы [email protected]