2010-02-17 44 views
22

Si vas a la respuesta aceptada de esta postC++: ¿qué es :: para?

Podría alguien explicar con más detalle por qué se utiliza:

double temp = ::atof(num.c_str()); 

y no simplemente

double temp = atof(num.c_str()); 

Además, ¿Se considera una buena práctica usar esa sintaxis cuando utilizas funciones globales "puras"?

+0

Además, ¿cómo se crea un enlace stackoverflow de modo que cuando alguien hace clic en él, vaya directamente a la respuesta (y no al comienzo de la página)? – sivabudh

+4

Con respecto a los enlaces de respuesta directa, busque en el ángulo inferior izquierdo en la parte inferior de la respuesta el enlace "enlace". –

+2

Me gusta esto: http://stackoverflow.com/questions/1012571/stdstring-to-float-or-double/1012604#1012604 –

Respuesta

32

Dice que use la versión global, no una declarada en el ámbito local. Entonces, si alguien ha declarado atof en su clase, este seguro usará el global.

Tenga una mirada en Wikipedia on this subject:

#include <iostream> 

using namespace std; 

int n = 12; // A global variable 

int main() { 
    int n = 13; // A local variable 
    cout << ::n << endl; // Print the global variable: 12 
    cout << n << endl; // Print the local variable: 13 
} 
18

:: es el operador de resolución de alcance. Su uso en este escenario, como unario operador, is to ensure that the name (atof) is always looked up in the global scope - esto puede ser útil para evitar que el ocultamiento de nombres interfiera con la búsqueda.

+0

Eso es gracioso, los ejemplos de Microsoft y Wikipedia son casi idénticos. Me pregunto cuál de ellos fue el que copió. – Skilldrick

+2

Lo más divertido es que probablemente sea 'std :: atof()' para C++;) –

1

::func() significa que esta función no está afiliada a ninguna clase específica. Se utiliza cuando existen muchas funciones con el mismo nombre, y para evitar confusiones entre la que usted desea y las funciones específicas de los miembros, usted antecede al nombre de la función con el operador de alcance.


De C++ Manual, cuarta edición, sección 17.2.1:

"nombres definidos en el ámbito global - los nombres declarados fuera de cualquier clase, función o espacio de nombres - se definen dentro del espacio de nombres global El mundial. espacio de nombres se declara implícitamente y existe en cada programa. Cada archivo que define entidades en el ámbito global agrega esos nombres al espacio de nombres global.

El operador de ámbito se puede usar para hacer referencia a los miembros del espacio de nombres global. implícito, no tiene un nombre; la notación

::member_name 

se refiere a un miembro del espacio de nombres global. "

1

Digamos que tiene dos versiones de una función f() definidas fuera de un espacio de nombres y una definida dentro. Ahora digamos que tiene una función más g() en el mismo espacio de nombres. Ahora si haces f() dentro de g() llamará a la definida en el mismo espacio de nombres. Pero si desea llamar a la versión global, debe hacerlo ::f()

2

El operador :: es el operador de resolución de alcance.

cuando se usa con un especificador de clase como A :: a, es para acceder al memeber de datos de la clase A. cuando se utiliza sin ningún tipo de especificador, se accede a la variable global.

Se utiliza principalmente en los siguientes concursos.

  1. Para hacer referencia a las variables globales.
  2. Para hacer referencia a los miembros estáticos de la clase
  3. Para evitar ambigüedades, cuando una clase hereda de varias clases [no virtuales base].
  4. Con using directive, para usar las funciones de clase base en la clase derivada, cuando hay una función en la clase base con el mismo nombre que la clase derivada, pero para un tipo diferente.
  5. Para acceder a las funciones definidas en el ámbito global, cuando tiene una función definida con la misma firma, como en double temp = :: atof (num.c_str());
  6. Para crear objetos de las clases anidadas.