Đây chắc hẳn là một trong những câu hỏi phổ biến của nhiều bạn khi mới học lập trình C++
Nếu dịch word-by-word thì "name" là "tên", "space" là "không gian". Suy ra, "namespace" tức là "không gian tên". Và using namespace std
tức là “sử dụng không gian tên std” (std là viết tắt của “standard“)
Nhờ có câu lệnh này mà chương trình có thể hiểu các đối tượng như cin
, cout
đến từ namespace nào
Các namespace trong C++ sẽ giúp các đoạn code tách biệt lẫn nhau trong những "không gian" riêng
Cùng xem ví dụ dưới đây:
Trong đoạn code này mình tự khai báo ra một namespace riêng có tên là MyNamespace
.
Trong namespace này mình lại khai báo 2 class có trùng tên là Person
.
Khi mình sử dụng class Person
để khởi tạo đối tượng trong hàm main(), chương trình ngay lập tức báo lỗi “Person” is ambiguous
, tức là nó “mơ hồ” không hiểu phải sử dụng class Person
ở trên hay Person
ở dưới.
Từ đó chúng ta có thể kết luận: Trong cùng một namespace sẽ không được phép có 2 class có tên giống nhau
Để khắc phục lỗi này, mình có thể sửa tên class thứ hai thành Person2
, để tránh trùng tên với class thứ nhất
Hoặc mình cũng có thể tạo thêm một namespace khác, và đưa 1 trong 2 class Person
này sang namespace mới vừa tạo. Sau đó, mình sẽ chỉ định rằng muốn sử dụng class Person
của namespace nào bằng toán tử ::
Khi ấy,**** việc tồn tại 2 class cùng có tên là Person
, nhưng nằm ở 2 namespace khác nhau, thì lại hoàn toàn hợp lệ****
Khi đi làm, các bạn cũng sẽ thấy các anh chị tiền bối sẽ hay sử dụng toán tử ::
hơn là using namespace
, để giúp tránh lỗi xung đột tên giữa các namespace với nhau
Ngoài ra, một namespace không nhất thiết chỉ xuất hiện trong 1 file, mà nó có thể nằm ở nhiều file riêng lẻ. Cậu có thể xem source code của các thư viện iostream
, heap
, deque
, ... cũng sẽ thấy sẽ thấy sự xuất hiện của namespace std bao bọc lấy xung quanh đoạn code của các thư viện này. Điều này chỉ ra rằng: những hàm, biến, class, ... được khai báo bên trong đó đều thuộc về namespace std
Đó cũng là lý do tại sao khi include các thư viện này, các cậu chỉ cần using namespace std
là có thể sử dụng được các biến, hàm, class, ... nằm trong tất cả những thư viện ấy