Çok makul cevaplar zaten. Bazı okuyuculara yardımcı olabilecek bir benzetmeyle karşılaşacağım. çalıştırmak istediğiniz bir program için yol ararken ::
` /
` dosya sistemi dizin ayırıcısı ' ' gibi çok çalışır. Düşünmek:
/path/to/executable
Bu çok açıktır - yürürlükteki PATH ne olursa olsun, yalnızca dosya sistemi ağacındaki tam olarak bu konumdaki bir yürütülebilir dosya bu belirtimle eşleşebilir. Benzer şekilde...
::std::cout
... C ++ ad alanı "tree" de eşit derecede açıktır.
Böyle mutlak yollarla zıt, siz (örn iyi UNIX kabukları yapılandırabilirsiniz zsh çözümlemek için) göreli geçerli dizinde veya herhangi elemanın altında yolları PATH
eğer öyleyse, ortam değişkeni PATH=/usr/bin:/usr/local/bin
ve "" içinde olduklarını /tmp
, sonra ...
X11/xterm
... /tmp/X11/xterm
başka bulursa, mutlu bir şekilde /usr/bin/X11/xterm
çalışırdı /usr/local/bin/X11/xterm
. Benzer şekilde, adında bir ad alanında olduğunuzu X
ve " using namespace Y
" efekti olduğunu varsayalım.
std::cout
... hiçbirinde bulunamadı ::X::std::cout
, ::std::cout
, ::Y::std::cout
nedeniyle, ve muhtemelen başka yerlerde bağımsız ve bağımlı arama (ADL, diğer adıyla Koenig arama). Yani, sadece ::std::cout
tam olarak hangi nesneyi kastettiğiniz konusunda gerçekten açıktır, ancak neyse ki, sağ akıllarında hiç kimse kendi sınıfını / yapısını veya " std
" adı verilen bir ad alanını veya " " olarak adlandırılan herhangi bir şeyi yaratmaz cout
, bu yüzden sadece pratikte kullanmak std::cout
iyidir.
Dikkate değer farklılıklar :
1) mermiler, sıralamayı kullanarak ilk eşleşmeyi kullanma eğilimindedir PATH
, oysa C ++ belirsiz olduğunuzda bir derleyici hatası verir.
En UNIX kabukları yalnızca koyarsanız bunu yaparken 2) C ++, herhangi lider kapsam olmadan isimleri, alanında isim eşleştirilebilir .
içinde PATH
.
3) C ++ her zaman genel ad alanında arama yapar ( /
örtük olarak size ait gibi PATH
).
İsim alanları ve sembollerin açıklığı hakkında genel tartışma
Mutlak ::abc::def::...
"yollar" kullanmak bazen sizi kullandığınız diğer ad alanlarından ayırmak, kitaplığının istemci kodunun da kullandığı içeriklerin ve hatta diğer kitaplıkların içeriği üzerinde kontrol sahibi olamayabilir. Öte yandan, sizi sembolün mevcut "mutlak" konumuna daha sıkı bağlar ve ad alanlarında örtük eşleştirmenin avantajlarını kaçırırsınız: daha az eşleme, ad alanları arasında kodun daha kolay taşınabilirliği ve daha özlü, okunabilir kaynak kodu .
Birçok şeyde olduğu gibi, bu dengeleyici bir eylemdir. Altında tanımlayıcıları C ++ Standart koyar sürü std::
daha az "benzersiz" olan cout
programcılar kendi kodunda tamamen farklı bir şey için kullanmak olabilir, (örneğin merge
, includes
, fill
, generate
, exchange
, queue
, toupper
, max
). İlişkisiz iki Standart olmayan kütüphanenin, yazarlar genellikle birbirlerinden habersiz veya daha az farkında oldukları gibi aynı tanımlayıcıları kullanma şansı daha yüksektir. Ve C ++ Standart kütüphanesi de dahil olmak üzere kütüphaneler sembollerini zamanla değiştirir. Tüm bunlar, eski kodları derlerken özellikle de using namespace
s'nin yoğun kullanımı olduğunda belirsizliğe neden olur : bu alanda yapabileceğiniz en kötü şey izinusing namespace
başlıkların başlıklarından kaçmak için, keyfi olarak büyük miktarda doğrudan ve dolaylı istemci kodu hangi ad alanlarının kullanılacağı ve belirsizliklerin nasıl yönetileceği konusunda kendi kararlarını veremez.
Yani, bir lider ::
C ++ programcı araç kutusunda bilinen bir çatışmayı aktif olarak belirsizleştirmek ve / veya gelecekteki belirsizlik olasılığını ortadan kaldırmak için bir araçtır ....
::
araçlar genel / anonim ad alanından değişkene başvurur.