2012-10-14 17 views

risposta

5

In questo caso non c'è differenza.

Questa notazione:

obj.Class::member

è solo per risolvere le ambiguità provenienti da eredità:

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

Non c'è differenza. La qualifica esplicita dello spazio dei nomi di ar è ridondante in questo caso.

Potrebbe non essere ridondante nei casi in cui l'ereditarietà (multipla, non virtuale) ridefinisce il nome ar. Esempio (forzato):

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

vedere sul http://liveworkspace.org/code/d25889333ec378e1382cb5af5ad7c203

+0

puoi spiegare cosa hai scritto come codice privato in classe A? – Rushil

+1

@Rushil Bene, questo è davvero fuori tema: è il modo più rapido per evitare che 'A' venga copiato (il che porterebbe alla doppia eliminazione di' A :: ar'). Si chiama [Rule Of Three] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) o, in C++ 11 [Rule Of Zero] (http: // rmartinho .github.com/2012/08/15/rule-of-zero.html) invece :) – sehe

+0

Ok. So che è fuori tema ma volevo sapere cosa significasse. :-) – Rushil

1

In questo caso non v'è alcuna differenza. Comunque immagina che ob sia di classe C che eredita sia dalla classe A che dalla classe B e sia A che B hanno un campo ar. Quindi non ci sarà altro modo per accedere ad ar, ma per specificare esplicitamente quale dei membri di dati ereditati si sta facendo riferimento.

0

Si suppone di leggere questo

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

come questo

A::ar[0] è la stessa cosa per ar[0], quindi le 2 righe sono fondamentalmente la stessa cosa e l'operatore :: viene utilizzato per indicare la cosiddetta risoluzione dello spazio dei nomi o solo lo spazio dei nomi.

dal ob è un oggetto di tipo A, la risoluzione dello spazio dei nomi è implicita e non è necessario A:: prima di accedere a ar[0].

Problemi correlati