2012-10-14 175 views

回答

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

} 
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

+0

你能解釋一下你在A班寫的私人代碼嗎? – Rushil

+1

@Rushil嗯,這是非常關鍵的問題:這是防止「A」被複制的最快方法(這會導致'A :: ar'的雙重刪除)。它被稱爲[Rule Of Three](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-ree),或者在C++ 11 [Rule Of Zero](http:// rmartinho) .github.com/2012/08/15/rule-of-zero.html)代替:) – sehe

+0

好的。我知道這是脫離主題,但我想知道這意味着什麼。 :-) – Rushil

1

在這種情況下是沒有區別的。然而,想象ob是從類A和類B繼承的類C,並且A和B都有一個字段ar。那麼就沒有其他的方法可以訪問ar,而是明確地指定你正在引用哪個繼承的數據成員。

0

你應該閱讀本

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

這樣

A::ar[0]它是ar[0]同樣的事情,所以2行基本上是相同的事情,運營商::用於指示所謂分辨率的命名空間,或者僅僅是命名空間。

因爲ob是類型A的對象,所以命名空間分辨率是隱含的,在訪問ar[0]之前,您不需要A::