มีคำตอบที่สมเหตุสมผลมากมายแล้ว ฉันจะชิปด้วยการเปรียบเทียบที่อาจช่วยให้ผู้อ่านบางคน ::
ทำงานได้มากเช่นตัวคั่นไดเรกทอรีระบบแฟ้ม ' /
' เมื่อค้นหาเส้นทางของคุณเพื่อหาโปรแกรมที่คุณต้องการเรียกใช้ พิจารณา:
/path/to/executable
สิ่งนี้ชัดเจนมาก - เฉพาะปฏิบัติการที่ตำแหน่งที่แน่นอนในทรีของระบบแฟ้มเท่านั้นที่สามารถจับคู่ข้อมูลจำเพาะนี้ได้โดยไม่คำนึงถึง PATH ที่มีผลบังคับใช้ ในทำนองเดียวกัน ...
::std::cout
... มีความชัดเจนเท่าเทียมกันใน "ต้นไม้" ของ C ++ เนมสเปซ
เมื่อเปรียบเทียบกับพา ธ สัมบูรณ์เช่นนั้นคุณสามารถกำหนดค่าเชลล์ UNIX ที่ดี (เช่นzsh ) เพื่อแก้ไขพา ธสัมพัทธ์ภายใต้ไดเรกทอรีปัจจุบันของคุณหรือองค์ประกอบใด ๆ ในPATH
ตัวแปรสภาพแวดล้อมของคุณดังนั้นหากPATH=/usr/bin:/usr/local/bin
และคุณอยู่ "ใน" /tmp
แล้ว ...
X11/xterm
... จะทำงานอย่างมีความสุข/tmp/X11/xterm
หากพบอื่นอื่น/usr/bin/X11/xterm
/usr/local/bin/X11/xterm
ในทำนองเดียวกันสมมติว่าคุณอยู่ในเนมสเปซที่เรียกว่าX
และมีusing namespace Y
ผลบังคับใช้" " แล้ว ...
std::cout
... อาจจะพบในใด ๆ ของ::X::std::cout
, ::std::cout
, ::Y::std::cout
และสถานที่อื่น ๆ อาจจะเนื่องมาจากการค้นหาโต้แย้งขึ้นอยู่กับ (ADL อาคานิกการค้นหา) ดังนั้นเพียง::std::cout
เป็นจริงอย่างชัดเจนเกี่ยวกับว่าที่คุณหมายถึงวัตถุ แต่ไม่มีใครโชคดีที่ในใจขวาของพวกเขาเคยจะสร้างชั้นของตัวเอง / struct หรือ namespace ที่เรียกว่า " std
" หรือสิ่งใด ๆ ที่เรียกว่า " cout
" ดังนั้นในทางปฏิบัติโดยใช้เพียงstd::cout
เป็นเรื่องปกติ
ความแตกต่างที่น่าสังเกต :
1) เชลล์มีแนวโน้มที่จะใช้คู่แรกโดยใช้การสั่งซื้อในPATH
ขณะที่ C ++ ให้ข้อผิดพลาดคอมไพเลอร์เมื่อคุณไม่ชัดเจน
2) ใน C ++ ชื่อโดยไม่ต้องขอบเขตชั้นนำใด ๆ สามารถจับคู่ใน namespace ปัจจุบันขณะที่ส่วนใหญ่เปลือกหอยยูนิกซ์เท่านั้นทำว่าถ้าคุณใส่ใน.
PATH
3) C ++ จะค้นหาเนมสเปซส่วนกลาง (เช่นมี/
ของคุณโดยปริยายPATH
)
การสนทนาทั่วไปเกี่ยวกับ namespaces และชัดเจนของสัญลักษณ์
::abc::def::...
บางครั้งการใช้"เส้นทาง" แบบสัมบูรณ์อาจมีประโยชน์ในการแยกคุณออกจากเนมสเปซอื่น ๆ ที่คุณใช้ส่วนหนึ่งของ แต่ไม่สามารถควบคุมเนื้อหาของหรือแม้แต่ไลบรารีอื่น ๆ ที่รหัสลูกค้าของห้องสมุดของคุณใช้ ในทางกลับกันมันจะทำให้คุณจับคู่กับตำแหน่งสัญลักษณ์ "สัมบูรณ์" ที่มีอยู่อย่างแน่นแฟ้นยิ่งขึ้นและคุณพลาดข้อดีของการจับคู่โดยนัยในเนมสเปซ: การมีเพศสัมพันธ์น้อยลง .
เช่นเดียวกับหลาย ๆ สิ่งมันเป็นการกระทำที่สมดุล c ++ มาตรฐานทำให้จำนวนมากของตัวระบุภายใต้std::
ที่น้อย "พิเศษ" กว่าcout
ที่โปรแกรมเมอร์อาจใช้สำหรับบางสิ่งบางอย่างที่แตกต่างกันอย่างสมบูรณ์ในรหัสของพวกเขา (เช่นmerge
, includes
, fill
, generate
, exchange
, queue
, toupper
, max
) สองไลบรารีที่ไม่เกี่ยวข้องที่ไม่ได้มาตรฐานนั้นมีโอกาสสูงกว่าที่จะใช้ตัวระบุเดียวกันกับผู้เขียนโดยทั่วไปแล้วจะไม่ได้ตระหนักถึงหรือน้อยกว่ากัน และไลบรารี - รวมถึงไลบรารีมาตรฐาน C ++ - เปลี่ยนสัญลักษณ์ของพวกเขาเมื่อเวลาผ่านไป ทั้งหมดนี้อาจสร้างความกำกวมเมื่อทำการคอมไพล์โค้ดเก่าโดยเฉพาะเมื่อมีการใช้งานจำนวนมากusing namespace
s: สิ่งที่แย่ที่สุดที่คุณสามารถทำได้ในพื้นที่นี้คืออนุญาตusing namespace
ในส่วนหัวเพื่อหลีกเลี่ยงขอบเขตของส่วนหัวเช่นว่ารหัสลูกค้าจำนวนมากทั้งทางตรงและทางอ้อมไม่สามารถตัดสินใจได้เองว่าควรใช้ namespaces ใดและวิธีการจัดการความคลุมเครือ
ดังนั้นสิ่งที่สำคัญที่สุด::
คือเครื่องมือหนึ่งในกล่องเครื่องมือของโปรแกรมเมอร์ C + + ที่จะลดความขัดแย้งที่รู้จักกันอย่างแข็งขันและ / หรือกำจัดความเป็นไปได้ของความคลุมเครือในอนาคต ....
::
หมายถึงการอ้างอิงตัวแปรจาก namespace ส่วนกลาง / ไม่ระบุชื่อ