C++: ¿para qué sirve ::?

4 minutos de lectura

avatar de usuario
sivabudh

Si vas a la respuesta aceptada de este post

¿Podría alguien explicar por qué usa:

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 usa funciones globales “puras”?

  • Con respecto a los enlaces directos a la respuesta, busque en la esquina inferior izquierda en la parte inferior de la respuesta el enlace “enlace”.

    – Jonathan Fausto

    17 de febrero de 2010 a las 17:07

  • Así: stackoverflow.com/questions/1012571/…

    – Otávio Décio

    17 de febrero de 2010 a las 17:07

  • Hay un pequeño texto que dice link después de la respuesta.

    – Skilldrick

    17 de febrero de 2010 a las 17:07

  • Hay un enlace debajo de cada respuesta que dice “enlace”; eso te dará un enlace permanente.

    – Will Vosden

    17 de febrero de 2010 a las 17:07

  • Mmmm… que tal std::atof(). ::atof() significa que has incluido <stdlib.h> y quiero la versión global, std::atof() significa que has incluido <cstdlib> (como un buen programador de C++) y quiere la versión en el std espacio de nombres

    – D. Shawley

    17 de febrero de 2010 a las 18:05

Dice usar la versión global, no una declarada en el ámbito local. Así que si alguien ha declarado un atof en su clase, este seguramente usará el global.

Mira esto Wikipedia sobre este tema:

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

:: es el operador de resolución de alcance. Su uso en este escenario, como operador unario, es asegurarse de que el nombre (atof) siempre se busca en el ámbito global — esto puede ser útil para evitar que la ocultación del nombre interfiera con la búsqueda.

  • Es divertido, los ejemplos de Microsoft y Wikipedia son casi idénticos. Me pregunto cuál copió cuál.

    – Skilldrick

    17 de febrero de 2010 a las 17:17

  • Lo más divertido es que esto probablemente debería ser std::atof() para C++ 😉

    – D. Shawley

    17 de febrero de 2010 a las 18:04

avatar de usuario
Narendra norte

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

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

Se utiliza principalmente en los siguientes concursos.

  1. Para referirse a las variables globales.
  2. Para referirse a los miembros estáticos de la clase.
  3. Para evitar ambigüedades, cuando una clase hereda de múltiples [ non-virtual
    base ] clases
  4. Con la directiva using, para usar las funciones de la clase base en la clase derivada, cuando hay una función en la clase base con el mismo nombre que el de 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.

Digamos que tienes dos versiones de una función. f() uno definido fuera de un espacio de nombres y otro definido dentro. Ahora digamos que tienes una función más g() en el mismo espacio de nombres. ahora si lo haces f() en el interior g() llamará al definido en el mismo espacio de nombres. Pero si desea llamar a la versión global, debe hacerlo ::f()

avatar de usuario
Alexandros Gezerlis

::func() significa que esta función no está afiliada a ninguna clase específica. Se usa cuando existen muchas funciones con el mismo nombre, y para evitar confusiones entre la que desea y funciones miembro específicas, precede el nombre de la función con el operador de ámbito.


De C++ Primer, 4.ª edición, sección 17.2.1:

“Los nombres definidos en el ámbito global (nombres declarados fuera de cualquier clase, función o espacio de nombres) se definen dentro del espacio de nombres global. El espacio de nombres global 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 alcance se puede utilizar para hacer referencia a miembros del espacio de nombres global. Dado que el espacio de nombres global está implícito, no tiene nombre; la notación

::member_name

hace referencia a un miembro del espacio de nombres global”.

¿Ha sido útil esta solución?