чи є автоматичними друзями конструктори копіювання та переміщення?


14

Ми можемо отримати доступ до приватних змінних іншого класу, коли визначаємо конструктори копіювання або переміщення. Чи робить їх C ++ 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.
    }
};

Загальна ідея, що стоїть за ним, полягає в тому, щоб дозволити взаємодії 2 або більше об'єктів одного типу, не піддаючи їх приватним членам.


10

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

Тому вони не friendє класом, тому що це не має жодного сенсу. Вони вже є частиною класу. Проте вони мають доступ до всіх privateчленів не тому, що вони є friend, а тому, що вони є частиною класу.

Якби неможливо ініціалізувати членів у конструкторі (оскільки вони недоступні), то вся концепція доступності членів була б безглуздою. (Як би ви ініціалізували члена?)


Крім того, доступність - це жодним чином не питання об'єкта, на який має доступ учасник. Доступність - питання лише в тому, де в коді використовується назва (ім'я учасника). Якщо функція може отримати доступ до члена одного екземпляра класу, то вона також може отримати доступ до члена іншого екземпляра того ж класу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.