2011-01-17 28 views
10

Duplicar posible:
What is this weird colon-member syntax in the constructor?¿Qué significa :: :: en C++?

yo creía que sabía todo, pero siempre hay algo que parece a aparecer. Quizás estoy olvidando algo. ¿Qué significa el : ::name? Sospecho que ::google significa desde el espacio de nombres global use google, protobuf, message. ¿Pero qué hace el : antes? No hay texto a la izquierda, así que no puede ser una etiqueta (¿o sí?). ¿Así que qué es lo?

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

-editar- Me siento tonto, la indention me atrapó. Pensé que estaba mirando dentro del cuerpo de la función. Esperaba que fuera algo nuevo.

+0

¿Es 'Namespace' una clase? – Naveen

+4

Aparentemente, y parece derivarse de :: google :: protobuf :: Message. – EboMike

+6

Si no conoce una característica básica de lenguaje tan importante como la * lista de inicializadores * constructor, entonces todavía está muy lejos de "saber todo". – AnT

Respuesta

12

La primera coma : está realmente allí como una indicación de que lo que sigue es una lista de inicializadores. Esto puede aparecer en el constructor de una clase como una forma de darles a los miembros de datos de esa clase algún valor inicial (de ahí el nombre) antes de que el cuerpo del constructor realmente se ejecute.

Un pequeño ejemplo, un formato diferente:

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

EDITAR

Como una nota adicional, si usted tiene una clase que las subclases de otra, la forma de invocar el constructor de la superclase es exactamente como esta dentro de la lista de inicializadores Sin embargo, en lugar de especificar el nombre de un miembro, debe especificar el nombre de la superclase.

7

El :: se refiere al alcance global. Por ejemplo:

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

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

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

-1 Ya que eso es global. y no contestó lo que solicité, lo que es ':'. –

+0

@ acidzombie24 Espera, no me votaste porque lo que dije es incorrecto (que no lo es), sino porque te dije algo que ya sabes? –

+1

no, voté en contra porque no respondió mi pregunta. > "¿Qué significa: :: name name?" Y "¿Pero qué significa el: ¿antes de hacerlo?" –

19

En un constructor, el uso de dos puntos se utiliza para la inicialización de variables y/o para llamar al constructor padre. Por ejemplo:

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

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

Ahora usted podría hacer el constructor del bar como este:

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

que establece x a 5. O:

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

que utiliza segundo constructor de foo con 8 como una argumento, luego establece x a 3.

Parece curioso en su código ya que tiene la combinación de : para la inicialización y :: para llegar al espacio de nombres global.

+0

Me siento tonto, pensé que estaba mirando dentro del cuerpo de la función. +1 y aceptado. –

+2

No hay razón para sentirse tonto. He visto muchas cosas que me hicieron hacer una doble toma al principio. Algunos lenguajes de programación realmente pueden ensuciar tu mente :) – EboMike

+0

muchas gracias EboMike por un comentario completo y claro. – Chavoosh

3

Parece que está trabajando con la herencia, que se extiende desde el espacio de nombres global.

class baseClass{ 
    public: 
    int someVal; 
}; 

class childClass : baseClass 
{ 
    public: 
    int AnotherVal; 
} 

Otras respuestas proporcionadas posteriormente son mucho más robustas.