5

これら2つのステートメントの違いは何ですか?

ob.A::ar[0] = 200;
ob.ar[0] = 200;

obクラスのオブジェクトはどこですかA

class A
{
    public:
        int *ar;
        A()
        {
            ar = new int[100];
        }
};
4

4 に答える 4

6

違いはありません。この場合、の明示的な名前空間修飾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でご覧ください

于 2012-10-14T19:52:59.073 に答える
5

この場合、違いはありません。

この表記法:

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

}
于 2012-10-14T19:56:31.817 に答える
1

この場合、違いはありません。ただし、obがクラスAとクラスBの両方を継承するクラスCであり、AとBの両方にフィー​​ルドarがあるとします。その場合、arにアクセスする他の方法はありませんが、参照している継承されたデータメンバーのどれを明示的に指定する必要があります。

于 2012-10-14T19:54:22.910 に答える
0

あなたはこれを読むことになっています

ob.A::ar[0] = 200;
ob.ar[0] = 200;

このような

A::ar[0]についても同じことなar[0]ので、2 行は基本的に同じものであり、演算子::は名前空間のいわゆる解決、または単に名前空間を示すために使用されます。

はタイプ A のオブジェクトであるため、名前空間の解決は暗黙的であり、アクセスする前にob必要ありません。A::ar[0]

于 2012-10-14T20:00:52.107 に答える