2010-08-13 12 views
12
void weight_data::rev_seq(string &seq){ 
//TODO 
std::reverse(seq.begin(), seq.end()); 
} 

In questo metodo ++ C, credo che questo metodo non restituisce niente, quindi il prefisso è void, che cosa fa :: dire i rapporti tra weight_data e rev_seq(string &seq)? Grazie!Cosa significa the :: in C++?

+0

:: si chiama Paamayim Nekudotayim in PHP. –

risposta

25

void è il tipo di ritorno. :: è l'operatore di risoluzione dell'ambito, quindi significa che rev_seq è compreso nell'ambito di weight_data. weight_data potrebbe essere uno spazio dei nomi o una classe (in base a ciò che hai dato, non è possibile dire quale).

+0

"weight_data" è definito come una struct in un file a.hpp con un metodo chiamato "rev_seq" (non implementato), quindi nel file a.cpp, questo metodo viene chiamato come quello che ho chiesto nella domanda numero – ladyfafa

+2

@ladyfafa: 'void weight_data :: rev_seq (string & seq) {...}' __is__ l'implementazione di quella funzione membro. – sbi

+0

@sbi: Ok, capisco; può essere implementato più di una volta? cioè in diversi file cpp, per realizzare diverse implementazioni della stessa funzione "rev_seq" che proviene dalla struct "weight_data" – ladyfafa

2

weight_data è un nome namespace o classe.

13

In C++,

  • A::B significa B è un identificatore all'interno sia namespace o class tipo A,
  • A.B significa B è un membro della struct, class o union tipo AN l'istanza di cui si fa riferimento dall'oggetto o riferimento A e
  • A->B significa B è un membro della struct, class o union tipo un'istanza di che viene indicato dal puntatore A. (E 'equivalente a (*A).B.)

In alcune altre lingue, tutti e tre i casi sono coperti solo da un ..

Si noti che in C++, funzione di membro non devono essere implementati (definiti) all'interno della loro classe di definizione. (Se lo sono, sono implicitamente inline.) Possono essere, e spesso lo sono, implementati in file di implementazione separata (.cpp). Questo ha il vantaggio che non tutti gli utenti di una classe devono ricompilare quando si cambia un'implementazione di una delle funzioni membro della classe. Quindi, a meno weight_data è un nome namespace, void weight_data::rev_seq(string &seq) {...} è una tale definizione di un membro di classe al di fuori della sua classe.

+1

che era molto completo, molte grazie! – ladyfafa

+2

Nota: gli operatori '*' e '->' possono essere sovraccaricati. Solitamente sono sovraccaricati solo per cose come iteratori e puntatori intelligenti. È possibile che un codice mal progettato sovraccarichi questi operatori. – Brian

+0

@Brian: Questo è un ottimo punto! – sbi

0

La riga void weight_data::rev_seq(string &seq) indica al compilatore che questa è la definizione della funzione membro rev_seq(string &seq) da weight_data. Se questo appena detto void rev_seq(string &seq) { ... } il compilatore potrebbe pensare che una funzione non membro veniva definita, in contrapposizione alla funzione rev_seq(string &seq) membro della classe weight_data.

class weight_data 
{ 
    void rev_str(string &seq); 
} 

può anche significare che rev_str si riferisce ad una funzione che fa parte del namespace weight_data.

namespace weight_data 
{ 
    void rev_str(string &seq); 
} 
+1

Si noti che 'weight_data' potrebbe essere uno spazio dei nomi. Inoltre, penso che intendevi scrivere "Se questo ha appena detto' void rev_seq (string & seq) {...} '...". – sbi

+0

Grazie sbi per aver portato questo a mio avviso. – joshu

0

solo pensato di aggiungere 2 cose più interessanti circa il ::

a) Operator :: è sia un unario e un operatore binario

struct A{ 
    int m; 
}; 

int x; 
int main(){ 
    ::x;      // Unary 
    int (A::*p) = &A::m;  // Binary 
} 

b) $ 10.3/12 - " La qualifica esplicita con l'operatore scope (5.1) sopprime il meccanismo di chiamata virtuale. "

struct A{ 
    virtual void f(){cout << 1;} 
}; 

struct B : A{ 
    void f(){cout << 2;} 
}; 

int x; 
int main(){ 
    B b; 
    A &ra = b; 
    ra.f();  // dynamic binding, prints 2 
    ra.A::f(); // suppress VF mechanism, prints 1. 
}