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

En este método C++, creo que este método no devuelve nada, por lo que el prefijo es void, lo que hace :: decir las relaciones entre weight_data y rev_seq(string &seq)? ¡Gracias!¿Qué significa :: en C++?

+0

:: se llama Paamayim Nekudotayim en PHP. –

Respuesta

25

void es el tipo de devolución. :: es el operador de resolución de alcance, por lo que significa que rev_seq está dentro del alcance de weight_data. weight_data podría ser un espacio de nombres o una clase (en función de lo que hayas dado, no es posible decir cuál).

+0

"weight_data" se define como una estructura en un archivo a.hpp con un método llamado "rev_seq" (no implementado), luego en un archivo .cpp, este método se llama como lo que pregunté en la pregunta – ladyfafa

+2

@ladyfafa: 'void weight_data :: rev_seq (string & seq) {...}' __is__ la implementación de esa función miembro. – sbi

+0

@sbi: Está bien, ya veo; puede ser implementado más de una vez? es decir, en diferentes archivos cpp, para hacer diferentes implementaciones de la misma función "rev_seq" que es de la estructura "weight_data" – ladyfafa

2

weight_data es un namespace o nombre de clase.

13

En C++,

  • A::B significa B es un identificador dentro de cualquiera namespace o class tipo A,
  • A.B significa B es un miembro de la una struct, class, o union tipo instancia a la que hace referencia el objeto o referencia A y
  • A->B significa B es un miembro de la struct, class, o union tipo una instancia de que se conoce por el puntero A. (Es equivalente a (*A).B.)

En algunos otros idiomas, los tres casos están cubiertos por una única ..

Tenga en cuenta que en C++, la función miembro no tiene que implementarse (definirse) dentro de la definición de su clase. (Si lo son, están implícitamente inline). Se pueden implementar, y con frecuencia se implementan, en archivos de implementación separados (.cpp). Esto tiene la ventaja de que no todos los usuarios de una clase necesitan volver a compilar cuando cambia una implementación de una de las funciones de miembros de la clase. Entonces, a menos que weight_data sea un nombre namespace, void weight_data::rev_seq(string &seq) {...} es una definición de miembro de clase fuera de su clase.

+1

que fue muy completo, muchas gracias! – ladyfafa

+2

Nota: Los operadores '*' y '->' pueden estar sobrecargados. Usualmente solo están sobrecargados por cosas como iteradores y punteros inteligentes. Es posible que un código mal diseñado sobrecargue estos operadores. – Brian

+0

@Brian: ¡Es un buen punto! – sbi

0

La línea void weight_data::rev_seq(string &seq) le dice al compilador que esta es la definición de la función miembro rev_seq(string &seq) del weight_data. Si esto acaba de decir void rev_seq(string &seq) { ... }, el compilador pensaría que se estaba definiendo una función no miembro, a diferencia de la función de miembro rev_seq(string &seq) de la clase weight_data.

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

También puede significar que rev_str refiere a una función que es parte del espacio de nombres weight_data.

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

Tenga en cuenta que 'weight_data' podría ser un espacio de nombres. Además, creo que quisiste escribir "Si esto solo dijera' void rev_seq (string & seq) {...} '...". – sbi

+0

Gracias sbi por traer esto a mi conocimiento. – joshu

0

acaba de ocurrir la adición de 2 cosas más interesantes acerca de la ::

a) del operador :: es a la vez un unario y un operador binario

struct A{ 
    int m; 
}; 

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

b) $ 10.3/12 - " La calificación explícita con el operador de alcance (5.1) suprime el mecanismo de llamada virtual ".

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