Không gian tên trong C ++
Hãy xem xét một tình huống, khi chúng ta có hai người có cùng tên, Zara, trong cùng một lớp. Bất cứ khi nào chúng ta cần phân biệt chúng chắc chắn chúng ta sẽ phải sử dụng một số thông tin bổ sung cùng với tên của chúng, chẳng hạn như khu vực, nếu chúng sống ở khu vực khác hoặc tên của mẹ hoặc cha của chúng, v.v.
Tình huống tương tự có thể phát sinh trong các ứng dụng C ++ của bạn. Ví dụ: bạn có thể đang viết một số mã có một hàm được gọi là xyz () và có một thư viện khác có sẵn cũng có cùng một hàm xyz (). Bây giờ trình biên dịch không có cách nào biết được phiên bản nào của hàm xyz () mà bạn đang đề cập đến trong mã của mình.
A namespaceđược thiết kế để khắc phục khó khăn này và được sử dụng làm thông tin bổ sung để phân biệt các hàm, lớp, biến tương tự, v.v. có cùng tên có sẵn trong các thư viện khác nhau. Sử dụng không gian tên, bạn có thể xác định ngữ cảnh mà tên được định nghĩa. Về bản chất, một không gian tên xác định một phạm vi.
Xác định không gian tên
Định nghĩa không gian tên bắt đầu bằng từ khóa namespace theo sau là tên không gian tên như sau:
namespace namespace_name {
// code declarations
}
Để gọi phiên bản hỗ trợ không gian tên của hàm hoặc biến, hãy thêm vào trước (: :) tên không gian tên như sau:
name::code; // code could be variable or function.
Hãy để chúng tôi xem cách không gian tên phạm vi các thực thể bao gồm cả biến và hàm -
#include <iostream>
using namespace std;
// first name space
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
}
// second name space
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
int main () {
// Calls function from first name space.
first_space::func();
// Calls function from second name space.
second_space::func();
return 0;
}
Nếu chúng tôi biên dịch và chạy đoạn mã trên, điều này sẽ tạo ra kết quả sau:
Inside first_space
Inside second_space
Chỉ thị sử dụng
Bạn cũng có thể tránh thêm các không gian tên với using namespacechỉ thị. Chỉ thị này cho trình biên dịch biết rằng mã tiếp theo đang sử dụng tên trong không gian tên được chỉ định. Do đó, không gian tên được ngụ ý cho đoạn mã sau:
#include <iostream>
using namespace std;
// first name space
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
}
// second name space
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
using namespace first_space;
int main () {
// This calls function from first name space.
func();
return 0;
}
Nếu chúng tôi biên dịch và chạy đoạn mã trên, điều này sẽ tạo ra kết quả sau:
Inside first_space
Lệnh 'using' cũng có thể được sử dụng để tham chiếu đến một mục cụ thể trong một không gian tên. Ví dụ: nếu phần duy nhất của không gian tên std mà bạn định sử dụng là cout, bạn có thể tham khảo nó như sau:
using std::cout;
Mã tiếp theo có thể tham chiếu đến cout mà không cần thêm vùng tên trước, nhưng các mục khác trong std không gian tên vẫn cần phải rõ ràng như sau:
#include <iostream>
using std::cout;
int main () {
cout << "std::endl is used with std!" << std::endl;
return 0;
}
Nếu chúng tôi biên dịch và chạy đoạn mã trên, điều này sẽ tạo ra kết quả sau:
std::endl is used with std!
Những cái tên được giới thiệu trong một usingchỉ thị tuân theo các quy tắc phạm vi bình thường. Tên có thể nhìn thấy từ điểm củausingchỉ thị đến cuối phạm vi mà chỉ thị được tìm thấy. Các thực thể có cùng tên được xác định trong phạm vi bên ngoài sẽ bị ẩn.
Không gian tên rõ ràng
Một không gian tên có thể được định nghĩa thành nhiều phần và do đó một không gian tên được tạo thành từ tổng các phần được xác định riêng biệt của nó. Các phần riêng biệt của một không gian tên có thể được trải rộng trên nhiều tệp.
Vì vậy, nếu một phần của không gian tên yêu cầu tên được xác định trong tệp khác, tên đó vẫn phải được khai báo. Viết định nghĩa không gian tên sau đây hoặc xác định một không gian tên mới hoặc thêm các phần tử mới vào một vùng tên hiện có -
namespace namespace_name {
// code declarations
}
Không gian tên lồng nhau
Không gian tên có thể được lồng vào nhau, nơi bạn có thể xác định một không gian tên bên trong một không gian tên khác như sau:
namespace namespace_name1 {
// code declarations
namespace namespace_name2 {
// code declarations
}
}
Bạn có thể truy cập các thành viên của không gian tên lồng nhau bằng cách sử dụng các toán tử phân giải như sau:
// to access members of namespace_name2
using namespace namespace_name1::namespace_name2;
// to access members of namespace:name1
using namespace namespace_name1;
Trong các câu lệnh trên nếu bạn đang sử dụng namespace_name1, thì nó sẽ làm cho các phần tử của namespace_name2 có sẵn trong phạm vi như sau:
#include <iostream>
using namespace std;
// first name space
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
// second name space
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
}
using namespace first_space::second_space;
int main () {
// This calls function from second name space.
func();
return 0;
}
Nếu chúng tôi biên dịch và chạy đoạn mã trên, điều này sẽ tạo ra kết quả sau:
Inside second_space