2012-10-14 15 views

Odpowiedz

5

W tym przypadku nie ma różnicy.

Ten zapis:

obj.Class::member

jest tylko w celu rozwiązania niejasności pochodzących z dziedziczenia:

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

Nie ma różnicy. W tym przypadku kwalifikacja jawnej przestrzeni nazw o numerze ar jest nadmiarowa.

Może nie być redundantny w przypadkach, gdy dziedziczenie (wielokrotne, niewirtualne) zmienia nazwę na ar. Próbkę (wymyślony):

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

Zobacz na http://liveworkspace.org/code/d25889333ec378e1382cb5af5ad7c203

+0

czy możesz wyjaśnić, co napisałeś jako prywatny kod w klasie A? – Rushil

+1

@Rushil Cóż, to naprawdę nie na temat: jest to najszybszy sposób, aby zapobiec kopiowaniu "A" (co doprowadziłoby do podwójnego usunięcia 'A :: ar'). Nazywa się [Rule Of Three] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) lub w C++ 11 [Rule Of Zero] (http: // rmartinho .github.com/2012/08/15/rule-of-zero.html) zamiast :) – sehe

+0

OK. Wiem, że to nie dotyczy tematu, ale chciałem wiedzieć, co to znaczy. :-) – Rushil

1

W tym przypadku nie ma żadnej różnicy. Jednak wyobraź sobie, że ob jest klasy C, która dziedziczy zarówno z klasy A i klasy B, a oba A i B mają pole ar. Wtedy nie będzie innego sposobu uzyskania dostępu do ar, ale jawne określenie, do którego z odziedziczonych elementów danych odwołujesz się.

0

Powinieneś przeczytać

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

jak ten

A::ar[0] to to samo dla ar[0], więc 2 wiersze są w zasadzie tym samym, a operator :: jest używany do wskazania tak zwanej rozdzielczości przestrzeni nazw lub tylko przestrzeni nazw.

od ob jest obiektem typu A, rozdzielczość przestrzeni nazw jest niejawna i nie potrzebujesz A:: przed uzyskaniem dostępu do ar[0].

Powiązane problemy