No - en C++, las clases de anidamiento solo afectan los nombres y la visibilidad, no la semántica de la clase en sí. En lo que respecta al código generado, la clase anidada no es diferente de una que no está anidada.
Todo lo que ha cambiado es la visibilidad y el nombre (por ejemplo, si está en una sección private:
de la clase externa, que no es visible para el mundo exterior, y si es en una sección public:
, es visible, pero (por supuesto) para nombrarlo usa outer_class::inner_class
. Sin embargo, es una clase completamente separada, por ejemplo, puede crear una instancia de la clase interna sin crear ninguna instancia de la clase externa.
Editar: Lo siento, me perdí parte de su pregunta. En C++ 0x, la clase interna tiene acceso a las partes privadas de la clase externa, en esencia, es como si la clase externa hubiera declarado a la clase interna como su amigo, por lo que los nombres privados son visibles, pero usted Todavía necesita pasar algo como una referencia a un objeto de la clase externa antes de que pueda invocar funciones miembro no estáticas de la clase externa.
Aunque no se supone que este sea el caso todavía, creo que la mayoría de los compiladores ya implementan esta parte en particular.
Parece que esto está cambiando en C++ 0x. C++ 03 dice: "Los miembros de una clase anidada no tienen acceso especial a los miembros de una clase adjunta". C++ 0x FCD dice: "Una clase anidada es miembro y, como tal, tiene los mismos derechos de acceso que cualquier otro miembro". (ambos §11.8/1). (El cambio fue introducido por los defectos 45 y 494 del CWG: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45 y http://www.open-std.org/ jtc1/sc22/wg21/docs/cwg_defects.html # 494) –
Bueno, eso elimina el impulso de escribir 'friend class {', que es compatible con algunos compiladores, pero no obviamente hace que la clase anidada no sea miembro en absoluto. – Potatoswatter
@Potato: Curiosamente, incluso Comeau en el estricto modo C++ 03 no sigue el lenguaje C++ 03. Esto me lleva a creer que (a) es probable que por alguna razón sea imposible seguir el lenguaje C++ 03 (aunque todavía no he descubierto por qué, exactamente, además de lo que se menciona en los DR vinculados anteriormente), y (b) es probable que nadie realmente siga el lenguaje C++ 03 :-). –