Sudah banyak jawaban masuk akal. Saya akan menambahkan analogi yang dapat membantu beberapa pembaca. ::
bekerja sangat mirip dengan pemisah direktori filesystem ' /
', ketika mencari jalur Anda untuk program yang ingin Anda jalankan. Mempertimbangkan:
/path/to/executable
Ini sangat eksplisit - hanya dapat dieksekusi di lokasi yang tepat di pohon sistem file yang dapat cocok dengan spesifikasi ini, terlepas dari PATH yang berlaku. Demikian pula...
::std::cout
... sama eksplisit di C ++ namespace "tree".
Berbeda dengan jalur absolut seperti itu, Anda dapat mengonfigurasi shell UNIX yang baik (misalnya zsh ) untuk menyelesaikan jalur relatif di bawah direktori Anda saat ini atau elemen apa pun dalam PATH
variabel lingkungan Anda , jadi jika PATH=/usr/bin:/usr/local/bin
, dan Anda berada "di" /tmp
, maka ...
X11/xterm
... akan dengan senang hati lari /tmp/X11/xterm
jika ditemukan, yang lain /usr/bin/X11/xterm
, yang lain /usr/local/bin/X11/xterm
. Demikian pula, katakanlah Anda berada di namespace bernama X
, dan " using namespace Y
" berlaku, lalu ...
std::cout
... dapat ditemukan di salah ::X::std::cout
, ::std::cout
, ::Y::std::cout
, dan tempat-tempat mungkin lain karena argumen-dependent lookup (ADL, alias Koenig lookup). Jadi, hanya ::std::cout
benar-benar eksplisit tentang objek yang Anda maksud, tetapi untungnya tidak ada orang waras yang pernah membuat kelas / struct atau namespace mereka sendiri yang disebut " std
", atau apa pun yang disebut " cout
", jadi dalam praktiknya menggunakan hanya std::cout
baik-baik saja.
Perbedaan yang patut diperhatikan :
1) shell cenderung menggunakan pertandingan pertama menggunakan urutan PATH
, sedangkan C ++ memberikan kesalahan kompilator ketika Anda telah ambigu.
2) Dalam C ++, nama tanpa lingkup utama dapat dicocokkan di namespace saat ini, sementara sebagian besar shell UNIX hanya melakukan itu jika Anda memasukkannya ke .
dalam PATH
.
3) C ++ selalu mencari namespace global (seperti memiliki /
Anda secara implisit PATH
).
Diskusi umum tentang ruang nama dan kesederhanaan simbol
Menggunakan ::abc::def::...
"jalur" absolut kadang-kadang bisa berguna untuk mengisolasi Anda dari ruang nama lain yang Anda gunakan, bagian dari tetapi tidak benar-benar memiliki kontrol atas konten, atau bahkan perpustakaan lain yang juga menggunakan kode klien perpustakaan Anda. Di sisi lain, ini juga memasangkan Anda dengan lebih erat ke lokasi simbol "absolut" yang ada, dan Anda kehilangan keuntungan dari pencocokan tersirat dalam ruang nama: lebih sedikit sambungan, lebih mudah mobilitas kode antara ruang nama, dan kode sumber yang lebih ringkas dan mudah dibaca .
Seperti banyak hal, ini adalah tindakan penyeimbang. C ++ Standar menempatkan banyak pengidentifikasi bawah std::
yang kurang "unik" dari cout
, bahwa programmer mungkin menggunakan untuk sesuatu yang sama sekali berbeda dalam kode mereka (misalnya merge
, includes
, fill
, generate
, exchange
, queue
, toupper
, max
). Dua perpustakaan non-Standar yang tidak terkait memiliki peluang yang jauh lebih tinggi untuk menggunakan pengidentifikasi yang sama karena para penulis umumnya tidak atau kurang menyadari satu sama lain. Dan perpustakaan - termasuk perpustakaan C ++ Standard - mengubah simbol mereka dari waktu ke waktu. Semua ini berpotensi menciptakan ambiguitas ketika mengkompilasi ulang kode lama, terutama ketika sudah ada banyak penggunaan using namespace
s: hal terburuk yang dapat Anda lakukan dalam ruang ini adalah memungkinkanusing namespace
ada di header untuk menghindari lingkup header, sehingga sejumlah besar kode klien langsung dan tidak langsung tidak dapat membuat keputusan sendiri tentang ruang nama mana yang akan digunakan dan bagaimana mengelola ambiguitas.
Jadi, yang terdepan ::
adalah salah satu alat di kotak alat programmer C ++ untuk secara aktif mengacaukan bentrokan yang diketahui, dan / atau menghilangkan kemungkinan ambiguitas di masa depan ....
::
berarti telanjang merujuk variabel dari namespace global / anonim.