Apakah salin dan pindahkan konstruktor teman otomatis?

14

Kita dapat mengakses variabel pribadi dari kelas lain ketika kita mendefinisikan copy atau memindahkan konstruktor. Apakah C ++ membuat mereka friendsatu sama lain secara otomatis?

Sebagai contoh:

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
sumber
7
Ini kelas yang sama. Jadi ne teman diperlukan.
M. Spiller
1
Lihat stackoverflow.com/questions/6921185/… - singkatnya, kontrol akses di C ++ tidak membedakan antara instance objek , hanya antara tipe yang berbeda.
osuka_
Ketika Anda menulis "kelas my_str lain" itu adalah kesalahan langsung. Ini contoh my_str yang lain , dan komentar serta jawaban lainnya menjelaskan apa yang diperlukan
JonathanZ mendukung MonicaC

Jawaban:

21

Itu tidak dianggap sebagai teman, tapi ya, fungsi anggota kelas apa pun my_strdapat mengakses anggota pribadi dari semua jenis contoh my_str, bukan hanya thisinstance:

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

Gagasan umum di balik itu adalah untuk memungkinkan 2 atau lebih objek dari jenis yang sama untuk berinteraksi tanpa harus mengekspos anggota pribadi mereka.

Shloim
sumber
10

Fungsi anggota dari kelas itu sendiri selalu memiliki akses ke privateanggota, tidak peduli apakah fungsi anggota didefinisikan di dalam kelas atau di luar kelas dan tidak peduli apakah itu merupakan fungsi anggota khusus seperti copy / move constructor.

Karena itu mereka bukan frienddari kelas, karena itu tidak masuk akal. Mereka sudah menjadi bagian dari kelas. Tetap, mereka memiliki akses ke semua privateanggota, bukan karena mereka adalah anggota friend, tetapi karena mereka adalah bagian dari kelas.

Jika tidak mungkin menginisialisasi anggota dalam konstruktor (karena mereka tidak dapat diakses), maka seluruh konsep aksesibilitas anggota tidak akan ada gunanya. (Bagaimana Anda menginisialisasi anggota?)


Selain itu, aksesibilitas bukanlah masalah objek yang diakses anggota. Aksesibilitas adalah masalah hanya di mana dalam kode nama (nama anggota) digunakan. Jika suatu fungsi dapat mengakses anggota dari satu instance kelas, maka itu juga dapat mengakses anggota instance lain dari kelas yang sama.

kenari
sumber