これら2つのステートメントの違いは何ですか?
ob.A::ar[0] = 200;
ob.ar[0] = 200;
ob
クラスのオブジェクトはどこですかA
class A
{
public:
int *ar;
A()
{
ar = new int[100];
}
};
違いはありません。この場合、の明示的な名前空間修飾ar
は冗長です。
(複数の非仮想)継承によって名前が再定義される場合は、冗長ではない可能性がありますar
。サンプル(考案):
#include <string>
class A
{
public:
int *ar;
A() { ar = new int[100]; }
// unrelated, but prevent leaks: (Rule Of Three)
~A() { delete[] ar; }
private:
A(A const&);
A& operator=(A const&);
};
class B : public A
{
public:
std::string ar[12];
};
int main()
{
B ob;
ob.A::ar[0] = 200;
ob.ar[0] = "hello world";
}
http://liveworkspace.org/code/d25889333ec378e1382cb5af5ad7c203でご覧ください
この場合、違いはありません。
この表記法:
obj.Class::member
継承から生じるあいまいさを解決するだけです:
class A {
public:
int a;
}
class B {
public:
int a;
}
class C : public A, B {
void func() {
// this objects holds 2 instance variables of name "a" inherited from A and B
this->A::a = 1;
this->B::a = 2;
}
}
この場合、違いはありません。ただし、obがクラスAとクラスBの両方を継承するクラスCであり、AとBの両方にフィールドarがあるとします。その場合、arにアクセスする他の方法はありませんが、参照している継承されたデータメンバーのどれを明示的に指定する必要があります。
あなたはこれを読むことになっています
ob.A::ar[0] = 200;
ob.ar[0] = 200;
このような
A::ar[0]
についても同じことなar[0]
ので、2 行は基本的に同じものであり、演算子::
は名前空間のいわゆる解決、または単に名前空間を示すために使用されます。
はタイプ A のオブジェクトであるため、名前空間の解決は暗黙的であり、アクセスする前にob
必要ありません。A::
ar[0]