Rất nhiều câu trả lời hợp lý rồi. Tôi sẽ đưa ra một sự tương tự có thể giúp một số độc giả. :: hoạt động rất giống như trình phân tách thư mục hệ thống tập tin ‘/‘, khi tìm kiếm đường dẫn của bạn cho một chương trình bạn muốn chạy. Xem xét:
/path/to/executableĐiều này rất rõ ràng – chỉ có một tệp thực thi tại vị trí chính xác đó trong cây hệ thống tệp có thể khớp với thông số kỹ thuật này, bất kể PATH có hiệu lực. Tương tự …
… Cũng rõ ràng không kém trong “cây” không gian tên C++.
Tương phản với các đường dẫn tuyệt đối như vậy, bạn có thể định cấu hình các shell UNIX tốt (ví dụ zsh ) để giải quyết đường dẫn tương đối trong thư mục hiện tại của bạn hoặc bất kỳ phần tử nào trong biến môi trường PATH của bạn, vì vậy nếu PATH=/usr/bin:/usr/local/bin, và bạn đã “ở” /tmp, thì …
… sẽ vui vẻ chạy /tmp/X11/xterm nếu được tìm thấy, khác /usr/bin/X11/xterm, khác /usr/local/bin/X11/xterm. Tương tự, giả sử bạn đang ở trong một không gian tên gọi là X và có hiệu lực ” using namespace Y“, sau đó …
… có thể được tìm thấy ở bất kỳ ::X::std::cout, ::std::cout, ::Y::std::cout, và có thể các nơi khác do tra cứu phụ thuộc đối số (ADL, còn gọi là tra cứu Koenig ). Vì vậy, chỉ ::std::cout thực sự rõ ràng về chính xác đối tượng của bạn, nhưng may mắn thay, không ai trong tâm trí của họ sẽ tạo ra lớp/cấu trúc hoặc không gian tên riêng của họ được gọi là ” std“, cũng không phải bất cứ thứ gì gọi là ” cout “, vì vậy trong thực tế chỉ sử dụng std::cout là ổn.
Sự khác biệt đáng chú ý :
1) shell có xu hướng sử dụng trận đấu đầu tiên bằng cách sử dụng thứ tự trong PATH, trong khi C++ gây ra lỗi trình biên dịch khi bạn không rõ ràng.
2) Trong C++, các tên không có bất kỳ phạm vi hàng đầu nào có thể được khớp trong không gian tên hiện tại, trong khi hầu hết các shell UNIX chỉ làm điều đó nếu bạn đặt . trong PATH.
3) C++ luôn tìm kiếm không gian tên toàn cầu (như có / ngầm định PATH) của bạn.
Sử dụng tuyệt đối ::abc::def::... “đường dẫn” đôi khi có thể hữu ích để cách ly bạn khỏi mọi không gian tên khác mà bạn đang sử dụng, một phần nhưng không thực sự kiểm soát nội dung hoặc thậm chí các thư viện khác mà mã máy khách của thư viện của bạn cũng sử dụng. Mặt khác, nó cũng kết nối bạn chặt chẽ hơn với vị trí “tuyệt đối” hiện tại của biểu tượng và bạn bỏ lỡ các lợi thế của kết hợp ngầm trong không gian tên: ít khớp nối hơn, di chuyển mã dễ dàng hơn giữa các không gian tên và mã nguồn dễ đọc hơn, ngắn gọn hơn .
Vì vậy, một :: hàng đầu là một công cụ trong hộp công cụ của lập trình viên C++ để chủ động phân tán một cuộc đụng độ đã biết và/hoặc loại bỏ khả năng mơ hồ trong tương lai ….