2012-08-31 13 views
5

He estado leyendo otras preguntas aquí y hay algo que me tiene confundido y espero que se pueda explicar. Estoy seguro de que es algo simple pero me está aludiendo.Espacios de nombre sin nombre vs variables privadas

Así que en C++ que tienen las variables privadas que son sólo visible dentro de la clase:

class MyClass 
{ 
    private: 
     int i; 
}; 

Pero también puede tener espacios de nombres sin nombre:

namespace 
{ 
    int i; 
} 

Ambos parecen ser privados de la clase, pero en el segundo caso, no puede ver que existen desde el archivo de encabezado. Al leer otras preguntas, parece que las funciones son diferentes ya que no puede pasarles objetos de clase. Pero no estoy seguro de cuál es la diferencia aquí para las variables.

¿Existe una desventaja para la 2ª manera que significa que todavía debe usar variables privadas?

Respuesta

13

No son lo mismo.

El entero i en el espacio de nombres anónimo será compartido por todas las instancias de MyClass.

El entero privado i en MyClass será único para cada instanciación de la clase.

El equivalente utilizando private sería hacer i estática:

//.h 
class MyClass 
{ 
    private: 
     static int i; 
}; 

e instanciar la única compartida i así:

//.cpp 
int MyClass::i = 0; 
+0

Eso es bastante obvio ahora, lo explicas. Sabía que en algunos casos se preferían a la estática, pero esas dos afirmaciones simplemente no se unieron en mi cabeza por alguna razón :-) Gracias – Firedragon

3

Los espacios de nombres no están relacionados con objetos/clases. En particular, si tiene dos objetos, cada uno tiene su propia copia de una variable privada.

3

Son bastante diferentes conceptos. El miembro de datos privados es visible solo para una clase, y en el caso no estático, cada instancia de clase posee uno de estos. El espacio de nombre anónimo le permite hacer que el código esté disponible solo para otros códigos en el mismo archivo. Entonces, en el caso de la variable única int, todos los códigos definidos en el mismo lugar que el espacio de nombres anónimo verían la misma variable individual.

5

Ambos parecen ser privados de la clase ...

No, sólo el primero es privado a la clase. Es una variable de miembro no estática; uno se instancia en cada objeto del tipo de clase.

El segundo no pertenece a ninguna clase; tiene una duración de almacenamiento estática, por lo que se crea una instancia para todo el programa. Cualquier cosa que acceda a ella está accediendo a la misma variable que cualquier otra cosa que acceda a ella. Al estar en un espacio de nombre sin nombre, solo es accesible dentro de la unidad de traducción (es decir, el archivo de origen) que lo define; pero es accesible a cualquier código allí, no solo a una clase en particular.

¿Existe una desventaja para la 2ª manera que significa que todavía debe usar variables privadas?

Si desea una copia de la variable en cada objeto de clase, necesita que sea un miembro no estático.

Si desea compartirlo entre todos los objetos, le corresponde si lo convierte en un miembro estático o lo coloca en un espacio de nombres dentro del archivo de implementación de la clase. A menudo hago lo último para simplificar la definición de la clase. Las desventajas son que el acceso no está restringido solo a la clase, sino a cualquier otra cosa en ese archivo, y no se puede acceder desde ningún código que pueda colocar en el encabezado.

Cuestiones relacionadas