Dalam C++, operator ::
digunakan untuk mengakses kelas, fungsi dan variabel dalam sebuah namespace atau kelas.
Jika spesifikasi bahasa yang digunakan .
bukannya ::
dalam kasus-kasus seperti ketika mengakses instance variable/metode dari objek maka akan menyebabkan kemungkinan ambiguitas yang tidak't hadir dengan ::
?
Mengingat bahwa C++ doesn't membiarkan nama-nama variabel yang ada juga jenis nama, saya dapat't pikir kasus mana yang bisa terjadi.
Klarifikasi: saya'm tidak bertanya mengapa ::
dipilih atas .
, hanya jika itu bisa bekerja?
Karena upaya untuk membuat C++ sebagian besar kompatibel dengan yang ada kode C (yang memungkinkan nama tabrakan antara nama objek dan struct kategori), C++ memungkinkan nama tabrakan antara nama kelas dan nama objek.
Yang berarti bahwa:
struct data {
static int member;
};
struct data2 {
int member;
};
void f(data2& data) {
data.member = data::member;
}
legit kode.
Contoh di mana keduanya adalah valid, tapi merujuk ke objek yang berbeda: ``
struct A { int i; };
struct B { int i; A B; };
int main() { B x {0, 1}; std::cout << x.B.aku << '\n'; std::cout << x.B::aku << '\n'; } ``
Lihat live pada coliru.
Ada perbedaan antara a::b
dan a.b
di mana ::
menyiratkan bahwa a
digunakan sebagai namespace, yang berarti bahwa itu adalah namespace atau typename. Asalkan C++ mendukung non-virtual jamak warisan dan bahwa variabel dapat memiliki sama jenis, ini strip kemungkinan referensi objek yang salah. It's diperlukan untuk template metaprogramming.
Contoh lain akan menjadi &B::foo
vs &B. foo
dalam konteks kelas B.
Mari memperpanjang @Deduplicator contoh: ``
struct A { int i; };
struct B : publik { int i; A; };
int main() { B x {1, 2}; std::cout << x.aku << '\n'; std::cout << x.B::aku << '\n'; // sama Dengan baris di atas. std::cout << x.A.aku << '\n'; std::cout << x.A::i << '\n'; // Tidak sama dengan baris di atas. } `` Live pada Coliru Viewer
Tidak memiliki kemungkinan untuk membedakan dengan bantuan ::, yang anggota kita ingin mengakses, itu adalah mungkin untuk mengakses anggota yang dinyatakan dalam kelas induk dengan nama yang sama.