Untuk apa kata kunci "teman" digunakan?

11

Bisakah Anda menjelaskan kepada saya mengapa friendkata kunci lebih disukai untuk memberikan hak akses ke data pribadi kelas?

Dalton
sumber
1
Jika Anda bertanya mengapa friendlebih disukai, cara lain apa yang biasanya Anda gunakan untuk mengakses data kelas privat dari luar?
Benjamin Bannier
@honk "Diutamakan" mungkin kata yang salah untuk digunakan di sini. Saya mengedit sebagian besar pos untuk memperbaiki tata bahasa dan yang lainnya dan saya menyimpan pilihan kata aslinya, tapi saya pikir mungkin ada kendala bahasa di sini.
Adam Lear
Saya tidak tahu karena saya membaca tentang teman hari ini secara kebetulan. dan artikel itu mengatakan jika saya tidak menggunakan teman, saya akan membuat kelas monolit.
Dalton

Jawaban:

17

Teman adalah cara klasik untuk memperluas antarmuka kelas.
Tetapi yang hebat adalah bahwa teman secara eksplisit mendokumentasikan niat Anda untuk secara ketat mengikat item tertentu ke kelas.

Catatan: Dengan menggunakan teman Anda mengikat teman-teman ke kelas.

Contoh sempurna adalah operator streaming di C ++

class Plop
{
    private:
        int  value;
        friend std::ostream& operator<<(std::ostream& stream, Plop const& data);
        friend std::istream& operator>>(std::istream& stream, Plop&       data);
};

std::ostream& operator<<(std::ostream& stream, Plop const& data)
{
     return stream << data.value << " ";
}
std::istream& operator>>(std::istream& stream, Plop&       data)
{
     return stream >> data.value;
}

Di sini kita memperluas antarmuka publik dari kelas Plop dengan cara yang memungkinkan kita untuk melakukan streaming objek masuk dan keluar dari aliran, tetapi tanpa memaparkan implementasi internal atau menyebabkan sakit kepala implementasi di masa depan dengan mengharuskan penggunaan metode get / set yang harus dipertahankan (karena mereka akan menjadi bagian dari antarmuka publik) bahkan jika implementasi internal diubah.

Catatan: Ini TIDAK memecah enkapsulasi tetapi ia mengikat dengan ketat operator stream ke implementasi kelas Plop (yaitu setiap perubahan pada implementasi kelas Plop akan membutuhkan perubahan pada implementasi operator stream). Tapi ini diharapkan. Semua bagian dari antarmuka publik (termasuk metode publik / terlindungi) terikat erat pada implementasi.

Tetapi Catatan: Anda telah secara eksplisit mendokumentasikan pengikatan ini sebagai bagian dari deklarasi kelas.

Catatan: Saya tidak akan menyebut teman sebagai cara yang disukai untuk mengekspos data pribadi. Penggunaan teman yang berlebihan bisa sama buruknya dengan mengekspos implementasi. Seperti semua fitur bahasa, itu harus digunakan dengan bijaksana.

Martin York
sumber
Jika Anda dapat mengakses data secara publik (misalnya melalui pengambil) apakah Anda akan menggunakan fungsi gratis saja?
Ioanna