2011-01-17 33 views
10

Eventuali duplicati:
What is this weird colon-member syntax in the constructor?Cosa significa: :: significa in C++?

Pensavo di sapere tutto, ma qualcosa sembra sempre di pop-up. Forse sto dimenticando qualcosa. Cosa significa ": ::name"? Sospetto che lo ::google significhi dallo spazio nomi globale utilizzare google, protobuf, message. Ma cosa fa il : prima di esso? Non c'è testo a sinistra quindi non può essere un'etichetta (o può ?!). Quindi, cos'è?

Namespace::Namespace() 
    : ::google::protobuf::Message() { 
    SharedCtor(); 
} 

-edit- Mi sento sciocca, l'indentazione mi ha fatto. Pensavo di guardare dentro il corpo della funzione. Speravo tanto che sarebbe stato qualcosa di nuovo.

+0

'Namespace' è una classe? – Naveen

+4

Apparentemente sì, e sembra derivare da :: google :: protobuf :: Message. – EboMike

+6

Se non si conosce la funzione di linguaggio di base così importante come * elenco inizializzatore costruttore *, si è ancora molto lontani dal "conoscere tutto". – AnT

risposta

12

I primi due punti : sono effettivamente lì come un'indicazione che quanto segue è un elenco di inizializzazione. Questo può apparire nel costruttore di una classe come un modo per dare ai membri dei dati di quella classe un valore iniziale (da cui il nome) prima che il corpo del costruttore sia effettivamente eseguito.

Un piccolo esempio, formattati in modo diverso:

class Foo { 
public: 
    Foo() : 
     x(3),  // int initialized to 3 
     str("Oi!"), // std::string initialized to be the string, "Oi!" 
     list(10) // std::vector<float> initialized with 10 values 
    { /* constructor body */ } 

private: 
    int x; 
    std::string str; 
    std::vector<float> list; 
}; 

EDIT

Come nota aggiuntiva, se si dispone di una classe che le sottoclassi un'altra, il modo di richiamare la vostra costruzione della superclasse è esattamente come questo , all'interno della lista di inizializzazione. Tuttavia, invece di specificare il nome di un membro, si specifica il nome della superclasse.

7

:: fa riferimento allo scopo globale. Ad esempio:

void f() { ... } // (1) 

namespace ns 
{ 
    void f() { ... } // (2) 

    void g() 
    { 
     f(); // calls (2) 
     ::f(); // calls (1) 
    } 
} 
+0

-1 lo so già :: è globale. e non ha risposto a quello che ho, ciò che è ':'. –

+0

@ acidzombie24 Aspetta, tu mi voti, non perché quello che ho detto è sbagliato (che non è), ma perché ti ho detto qualcosa che già conosci? –

+1

no, ho votato perché non hai risposto alla mia domanda. > "Che cosa significa: :: name?" E "Ma cosa significa: fare prima di esso?" –

19

In un costruttore, l'utilizzo di due punti viene utilizzato per l'inizializzazione delle variabili e/o per chiamare il costruttore padre. Per esempio:

struct foo { 
    foo(); 
    foo(int var); 
}; 

struct bar : public foo { 
    bar(); 
    int x; 
}; 

Ora si potrebbe fare il costruttore di bar come questo:

bar::bar() 
: x(5) 
{ 
} 

che imposta x a 5. Oppure:

bar::bar() 
: foo(8) 
, x(3) 
{ 
} 

che utilizza secondo costruttore di foo con 8 come argomento, quindi imposta x su 3.

Sembra proprio divertente nel codice poiché si dispone della combinazione di : per l'inizializzazione e :: per raggiungere lo spazio dei nomi globale.

+0

Mi sento sciocco, ho pensato che stavo guardando dentro il corpo della funzione. +1 e accettato. –

+2

Nessun motivo per sentirsi stupidi. Ho visto un sacco di cose che mi hanno fatto fare un doppio approccio all'inizio. Alcuni linguaggi di programmazione possono davvero incasinare la tua mente :) – EboMike

+0

grazie mille EboMike per un commento completo e chiaro. – Chavoosh

3

Sembra funzionare con l'ereditarietà, estendendosi dallo spazio dei nomi globale.

class baseClass{ 
    public: 
    int someVal; 
}; 

class childClass : baseClass 
{ 
    public: 
    int AnotherVal; 
} 

Altre risposte fornite in seguito sono molto più affidabili.