Разница между этим полем и полем Class::?
Мне интересно что-то в С++.
Принятие следующего кода:
int bar;
class Foo
{
public:
Foo();
private:
int bar;
};
Внутри моего класса есть ли разница между this->bar
и Foo::bar
? Существуют ли случаи, когда один недействителен?
Ответы
Ответ 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
}