2011-12-10 21 views
12

He leído que las principales diferencias entre clases y estructuras (que no sean funciones), es que los miembros de la clase son privados por defecto, mientras que los miembros de la estructura son públicos por defecto.C++ Estructuras Privadas

Eso implica que los miembros de la estructura pueden ser privados. Mi pregunta es: ¿Pueden tener miembros de la estructura privada? Y si puede, ¿cuál es el propósito de usar miembros privados? ¿Cómo accederías a ellos?

+0

Accederá a los miembros de la estructura privada de la misma forma que accede a los miembros de la clase privada. La pregunta solo tiene sentido si piensas en estructuras y clases como diferentes. Intenta pensar en ellos como bastante idénticos. –

Respuesta

19

Sí, las estructuras pueden tener miembros privados, solo necesita usar el especificador de acceso para el mismo.

struct Mystruct 
{ 
    private: 
     m_data; 

}; 

La única diferencia entre la estructura y la clase son:

  • especificador de acceso por defecto es privada para la clase y pública para struct
  • herencia por defecto es privada para la clase y pública para struct

¿Cómo puede acceder a ellos?
Al igual que accede a miembros privados de una clase. es decir: sólo se puede acceder dentro de las funciones miembro estructuras y no en estructura derivada etc.

1

El solamente diferencia entre struct y class es de acceso predeterminado (con la excepción de algunas situaciones plantilla extraños, ver los comentarios de Alf a continuación) . Esto significa que puede acceder a miembros privados de la misma manera que en una clase:

struct foo { 
    int get_X() { return x; } 
    void set_X(int x_) { x = x_; } 
private: 
    int x; 
}; 

Ya sea que utilice o structclass, entonces, es puramente una cuestión de estilo. Tiendo a usar struct cuando todos los miembros son públicos (por ejemplo, si se trata de una clase functor sin variables miembro y solo funciones públicas).

+4

bueno, con respecto a las palabras clave también hay una diferencia en una lista de parámetros de plantilla, p. 'plantilla clase Barra>'. no puedes escribir eso con 'struct'. :-) –

+0

@ AlfP.Steinbach, interesante. Siempre escribo plantillas con 'typename', así que nunca me di cuenta :) – bdonlan

+2

no se puede usar' typename' para eso (sería un error de sintaxis). Cheers, –

0

Una cosa que hace que esto sea útil es que también puedes utilizar la palabra clave friend en structs, por lo que los miembros privados solo pueden ser usados ​​y modificados por esas funciones o clases específicas o lo que no quieras modificar. . De esta forma, el usuario no puede modificar esas secciones por sí mismo. Ni siquiera aparecerán en las funciones de autocompletar, al menos en Visual Studio.