Penggunaan khas adalah untuk memberikan akses ke fungsi yang membentuk bagian dari antarmuka kelas, tetapi berkat aturan lain tidak dapat benar-benar menjadi bagian dari kelas yang semestinya. Inserters / extractors untuk iostreams adalah contoh klasik:
namespace whatever {
class something {
// ...
friend std::ostream &operator<<(std::ostream &os, something const &thing);
friend std::istream &operator>>(std::istream &is, something &thing);
};
}
Menjadikan para operator ini anggota kelas tidak akan bekerja. Operasi I / O terlihat seperti:
whatever::something thing;
std::cout << thing;
Untuk operator yang diimplementasikan sebagai fungsi anggota, ini akan diselesaikan sebagai:
std::cout.operator<<(thing);
Yaitu, fungsi harus menjadi anggota std::cout
, bukan dari something
. Karena kami tidak ingin std::ostream
terus-menerus memodifikasi , satu-satunya pilihan kami yang masuk akal adalah membebani operator dengan fungsi bebas alih-alih fungsi anggota. Itu membuat kita memiliki dua kemungkinan: mengabaikan enkapsulasi sepenuhnya, dan membuat segala sesuatu di kelas publik, atau menjaganya tetap pribadi, tetapi memberikan akses ke beberapa hal yang benar-benar membutuhkannya.
Membuat kelas lain menjadi teman agak kurang umum. Dalam hal ini, Anda biasanya membuat sesuatu berdasarkan urutan modul atau subsistem - sekumpulan kelas yang bekerja bersama dan memiliki beberapa tingkat akses khusus satu sama lain yang tidak diberikan kepada dunia secara luas.