копировать и перемещать конструкторы автоматически друзья?


14

Мы можем получить доступ к закрытым переменным другого класса, когда определяем конструкторы копирования или перемещения. С ++ делает их friendдруг другу автоматически?

Например:

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
Это тот самый класс. Так что друг нужен.
М. Спиллер

1
См. Stackoverflow.com/questions/6921185/… - короче говоря, контроль доступа в C ++ не различает экземпляры объектов , а только между различными типами.
osuka_

Когда вы пишете «еще один класс my_str», это прямая ошибка. Это еще один экземпляр my_str , и другие комментарии и ответы объясняют, что это влечет за собой
JonathanZ поддерживает MonicaC

Ответы:


21

Это не считается другом, но да, любая функция-член класса my_strможет получить доступ к закрытым членам всех экземпляров типа my_str, а не только thisэкземпляра:

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

Общая идея заключается в том, чтобы позволить двум или более объектам одного и того же типа взаимодействовать без необходимости выставлять свои закрытые члены.


10

Функции-члены самого класса всегда имеют доступ к privateчленам, независимо от того, определена ли функция-член в классе или вне класса, и не важно, является ли она специальной функцией-членом, такой как конструктор копирования / перемещения.

Поэтому они не friendиз класса, потому что это не имеет никакого смысла. Они уже являются частью класса. Тем не менее, они имеют доступ ко всем privateчленам не потому, что они friend, а потому, что они являются частью класса.

Если бы не было возможности инициализировать элементы в конструкторе (потому что они недоступны), тогда вся концепция доступности элементов была бы бессмысленной. (Как бы вы инициализировали участника?)


Кроме того, доступность никоим образом не зависит от объекта, к которому обращаются члены. Доступность зависит только от того, где в коде используется имя (имя члена). Если функция может получить доступ к члену одного экземпляра класса, то она также может получить доступ к члену другого экземпляра того же класса.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.