i costruttori di copia e spostamento sono amici automatici?


14

Possiamo accedere alle variabili private di un'altra classe quando definiamo i costruttori di copia o spostamento. Il C ++ li rende gli uni friendagli altri automaticamente?

Per esempio:

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

7
Questa è la stessa classe. Quindi è necessario un amico.
M. Spiller,

1
Vedi stackoverflow.com/questions/6921185/… - in breve, il controllo degli accessi in C ++ non rileva tra istanze di oggetti , ma solo tra tipi diversi.
osuka_

Quando scrivi "un'altra classe my_str" è un errore evidente. È un'altra istanza my_str , e altri commenti e risposte spiegano che cosa comporta
JonathanZ supporta MonicaC il

Risposte:


21

Non è considerato amico, ma sì, qualsiasi funzione membro della classe my_strpuò accedere a membri privati ​​di tutte le istanze di tipo my_str, non solo l' thisistanza:

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.
    }
};

L'idea generale dietro è quella di consentire a 2 o più oggetti dello stesso tipo di interagire senza dover esporre i loro membri privati.


10

Le funzioni membro della classe stessa hanno sempre accesso ai privatemembri, indipendentemente dal fatto che la funzione membro sia definita in classe o fuori classe e indipendentemente dal fatto che si tratti di una funzione membro speciale come un costruttore di copia / spostamento.

Pertanto non fanno friendparte della classe, perché non ha alcun senso. Fanno già parte della classe. Tuttavia, hanno accesso a tutti i privatemembri, non perché sono friends, ma perché fanno parte della classe.

Se non fosse possibile inizializzare i membri in un costruttore (perché sono inaccessibili), l'intero concetto di accessibilità dei membri sarebbe inutile. (Come si inizializzerebbe il membro?)


Inoltre, l'accessibilità non è in alcun modo una questione dell'oggetto su cui si accede a un membro. L'accessibilità dipende solo da dove nel codice viene utilizzato un nome (il nome del membro). Se una funzione può accedere al membro di un'istanza di una classe, allora può anche accedere al membro di un'altra istanza della stessa classe.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.