¿Los constructores de copiar y mover son amigos automáticos?

14

Podemos acceder a variables privadas de otra clase cuando definimos copiar o mover constructores. ¿C ++ los hace el uno friendal otro automáticamente?

Por ejemplo:

my_str::my_str(my_str&& m) 
{
    size_ = m.size_; //accessing private variable another my_str class
    buff_ = m.buff_; //accessing private variable another my_str class
    m.buff_ = nullptr;
    m.size_ = 0;
}
redkont
fuente
77
Esta es la misma clase. Entonces se necesita un amigo.
M. Spiller
1
Consulte stackoverflow.com/questions/6921185/… . En resumen, el control de acceso en C ++ no distingue entre instancias de objetos , solo entre diferentes tipos.
osuka_
Cuando escribes "otra clase my_str" es un error directo. Es otra instancia de my_str , y otros comentarios y respuestas explican lo que eso implica
JonathanZ apoya a MonicaC el

Respuestas:

21

No se considera amigo, pero sí, cualquier función miembro de la clase my_strpuede acceder a miembros privados de todas las instancias de tipo my_str, no solo la thisinstancia:

class my_str {
    void foo(my_str& other) {
        // can access private members of both this-> and other.
    }

    static void bar(my_str& other) {
        // can access private members of other.
    }
};

La idea general detrás de esto es permitir que 2 o más objetos del mismo tipo interactúen sin tener que exponer a sus miembros privados.

Shloim
fuente
10

Las funciones miembro de la clase en sí siempre tienen acceso a los privatemiembros, sin importar si la función miembro se define dentro de la clase o fuera de clase y si se trata de una función miembro especial como un constructor de copia / movimiento.

Por lo tanto, no son friendde la clase, porque eso no tiene ningún sentido. Ya son parte de la clase. Aún así, tienen acceso a todos los privatemiembros, no porque sean friends, sino porque son parte de la clase.

Si no fuera posible inicializar miembros en un constructor (porque son inaccesibles), entonces todo el concepto de accesibilidad de miembros sería inútil. (¿Cómo inicializarías al miembro?)


Además, la accesibilidad no es de ninguna manera una cuestión del objeto en el que se accede a un miembro. La accesibilidad es solo una cuestión de en qué parte del código se usa un nombre (el nombre del miembro). Si una función puede acceder al miembro de una instancia de una clase, entonces también puede acceder al miembro de otra instancia de la misma clase.

nuez
fuente