Không gian tên C ++

C Namespace



Không gian tên trong C ++ là một phạm vi tổng quát. Phần khai báo của nó bắt đầu bằng từ dành riêng, không gian tên, theo sau là tên do người lập trình lựa chọn, sau đó là khối trong dấu ngoặc nhọn. Khối chứa các khai báo và / hoặc định nghĩa cơ bản của các đối tượng C ++, các hàm và các thực thể khác.

Hãy xem xét hai câu lệnh vô hướng sau trong phạm vi toàn cục, trong chương trình sau:







#bao gồm
sử dụng không gian tên std;

NSvarId= 5;
trôi nổivarId= 2.3;

NSchủ chốt()
{

trở lại 0;
}

Nỗ lực biên dịch chương trình này dẫn đến lỗi biên dịch. Có hai biến có cùng tên, varId . Mặc dù chúng là hai biến khác nhau thuộc hai loại khác nhau, NStrôi nổi , trình biên dịch từ chối hai khai báo vì chúng có cùng tên. Chương trình sau giải quyết vấn đề này bằng cách khai báo các biến có cùng tên trong hai phạm vi tổng quát khác nhau:



#bao gồm
sử dụng không gian tên std;

không gian tên NA
{
NSvarId= 5;
}

không gian tên NB
{
trôi nổivarId= 2.3;
}

NSchủ chốt()
{
Giá cả<<NA::varId << ' ';
Giá cả<<NB::varId << ' ';

trở lại 0;
}

Kết quả như sau:



5
2.3

Có hai không gian tên trong chương trình trên: NA , có định nghĩa về một số nguyên và NB , có định nghĩa là float nhưng trùng tên với số nguyên của NA. Cuối cùng, khi chương trình được chạy, tên giống nhau cho hai biến khác nhau đã được sử dụng. Lưu ý rằng để truy cập cùng một tên của hai biến khác nhau, phải sử dụng tên cụ thể cho không gian tên, theo sau là mã định danh chung. Tên không gian tên và số nhận dạng chung được phân tách bằng toán tử phân giải phạm vi, :: . Tên của các không gian tên sẽ phân biệt các đối tượng.





Bài viết này trình bày khái niệm cơ bản về không gian tên và cách sử dụng nó trong ngôn ngữ lập trình C ++. Để theo dõi bài viết này, bạn nên có kiến ​​thức cơ bản về ngôn ngữ C ++. Bạn cũng nên có kiến ​​thức về phạm vi C ++, mặc dù nó được giải thích ngắn gọn trong bài viết này. Để tìm hiểu thêm về phạm vi C ++, hãy tìm kiếm cụm từ Phạm vi trong C ++ (không có dấu ngoặc kép) trong hộp tìm kiếm của bất kỳ trang web linuxhint.com nào và nhấn Enter. Điều này sẽ dẫn bạn đến bài báo mà tác giả này đã viết.

Nội dung bài viết

Không gian tên là gì?

Vùng khai báo là phần lớn nhất của chương trình trong đó tên của một thực thể (biến) là hợp lệ. Vùng này được gọi là phạm vi. Không gian tên trong C ++ là một phạm vi tổng quát có mục đích chính là giải quyết xung đột tên. Không gian tên có các khai báo và / hoặc định nghĩa cơ bản về các thực thể.



Không gian tên toàn cầu và vấn đề của nó

Không gian tên toàn cục là phạm vi toàn cầu. Hãy xem xét chương trình ngắn sau:

#bao gồm
sử dụng không gian tên std;

NSdanh tính= 55;
trôi nổidanh tính= 12,17;

NSchủ chốt()
{

trở lại 0;
}

Trong chương trình trên, có hai biến, cả hai đều được gọi là danh tính . Các biến này thuộc phạm vi toàn cục; nghĩa là, chúng nằm trong không gian tên chung. Nỗ lực biên dịch chương trình này sẽ không thành công với một thông báo lỗi. Phạm vi toàn cục không chấp nhận nhiều hơn một biến có cùng tên, vì vậy cần có một không gian tên tùy chỉnh.

Không gian tên tùy chỉnh

Không gian tên không chỉ có một tên. Thay vào đó, một không gian tên có một tập hợp các tên để tránh xung đột với các tập hợp tên khác. Để tránh xung đột thấp hơn trong mã, hãy đặt trước mỗi tên bằng tên của không gian tên và :: . Chương trình sau minh họa điều này bằng cách sử dụng hai không gian tên tùy chỉnh:

#bao gồm
sử dụng không gian tên std;

không gian tên NA
{
NSvarInt= 6;
trôi nổiflt;
}

không gian tên NB
{
NSvarInt= 7;
trôi nổiflt;
}

NSchủ chốt()
{
Giá cả<<NA::varInt << ' ';
Giá cả<<NB::varInt << ' ';
NA::flt = 2,5;
NB::flt = 4.8;
Giá cả<<NA::flt << ' ';
Giá cả<<NB::flt << ' ';

trở lại 0;
}

Đầu ra là:

6
7
2,5
4.8

Lưu ý rằng các tên NA :: fltNB :: flt cuối cùng đã được xác định trong chủ chốt() hàm số. C ++ không cho phép định nghĩa như vậy trong phạm vi toàn cục.

Lưu ý rằng không gian tên tùy chỉnh là không gian tên lồng nhau cho không gian tên chung.

Chỉ thị sử dụng

Để tránh gõ không gian tên :: tên mọi lúc thay vì chỉ đặt tên sau khi khai báo không gian tên, bạn có thể sử dụng sử dụng chỉ thị. Cú pháp để sử dụng sử dụng chỉ thị như sau:

sử dụng không gian tên Namespace_name;

Các sử dụng Chỉ thị không phải là một chỉ thị tiền xử lý, vì vậy nó kết thúc bằng dấu chấm phẩy (;).

Chương trình sau đây minh họa việc sử dụng sử dụng chỉ thị và hơn thế nữa:

#bao gồm
sử dụng không gian tên std;

không gian tên NB
{
NSvarInt= 7;
NShàm số()
{
trở lạivarInt;
}
}

NSfn()
{
sử dụng không gian tên NB;
NSmyVar2=hàm số();
// các đối tượng và chức năng khác từ NB theo sau.
trở lạimyVar2;
}

NSmyVar3=NB::hàm số();

NSchủ chốt()
{
Giá cả<<fn() << '' <<myVar3<< ' ';

trở lại 0;
}

Đầu ra của chương trình này là 7 7 . Thời hạn sử dụng không gian tên NB; đã được đặt ở đầu fn () Định nghĩa. Các func () từ không gian tên NB được gọi ngay bên dưới không gian đó, không đứng trước NB :: .

Một biến được khai báo trong phạm vi toàn cục (không gian tên toàn cục) được nhìn thấy từ điểm khai báo đến cuối tệp. Nó cũng được nhìn thấy trong không gian tên lồng nhau (phạm vi lồng nhau), chẳng hạn như fn () phạm vi chức năng trên. Các sử dụng Chỉ thị tham gia không gian tên của nó từ vị trí mà nó được đặt đến cuối phạm vi mà nó được đặt.

Tên func () từ không gian tên NB không thể nhìn thấy bên dưới fn () định nghĩa bởi vì sử dụng không gian tên NB; đã được đặt trong phạm vi chức năng (khối). Trong điều kiện này, để sử dụng func () bên ngoài khối không gian tên NB (phạm vi), nó phải đứng trước NB :: , như trong câu lệnh sau:

NSmyVar3=NB::hàm số();

Các sử dụng Chỉ thị tham gia không gian tên của nó với không gian tên lồng ngoài từ vị trí mà nó được đặt đến cuối vùng tên lồng ngoài. Trong chương trình sau, không gian tên NA được kết hợp với không gian tên chung. Cả hai không gian tên sau đó mở rộng thành fn () không gian tên định nghĩa hàm, trong đó chúng được nối với không gian tên NB. Không gian tên NB kết thúc ở cuối fn () định nghĩa hàm, và hai không gian tên trước đó tiếp tục cho đến cuối tệp (đọc qua mã).

#bao gồm
sử dụng không gian tên std;

không gian tên NA
{
NSvarInt= 6;
NShàm số()
{
trở lạivarInt;
}

}

không gian tên NB
{
NSvarInt= 7;
NShàm số()
{
trở lạivarInt;
}
}

sử dụng không gian tên NA;
NSmyVar0=varInt;
// các đối tượng và chức năng khác từ :: và NB theo sau.

NSfn()
{
NSmyVar1=varInt;
sử dụng không gian tên NB;
NSmyVar2=NB::hàm số();
// các đối tượng và chức năng khác từ NB theo sau, cho đến hết phạm vi này.
trở lạimyVar1+myVar2;
}

// Chỉ các đối tượng và hàm từ :: và NB theo sau.

NSmyVar3=NB::hàm số();

NSchủ chốt()
{
Giá cả<<myVar0<< '' <<fn() << '' <<myVar3<< ' ';

trở lại 0;
}

Đầu ra là 6, 13, 7 .

Ghi chú: Không gian tên chung được biểu thị bằng :: , nghĩa là không có gì trước toán tử phân giải phạm vi theo sau.

Bên dưới tuyên bố, sử dụng không gian tên NA; các biến từ không gian tên toàn cục và NA có thể được sử dụng mà không cần chỉ dẫn về không gian tên nguồn của chúng. Câu lệnh tiếp theo sử dụng varInt của không gian tên NA. Khu vực không gian tên kết hợp toàn cầu và Bắc Mỹ mở rộng vào fn () vùng tên hàm. Nên varInt của câu lệnh đầu tiên trong fn () phạm vi chức năng, là không gian tên NA.

Vì khu vực dành cho không gian tên toàn cầu và NA mở rộng khắp fn () phạm vi, sau int myVar2 = NB :: func (); , bất kỳ tên nào từ không gian tên NB chỉ có thể được sử dụng trong fn () phạm vi mà không đứng trước nó với NB :: , chỉ khi nó không xảy ra trong NA và không gian tên toàn cục (khối). Nếu không, nó phải được đặt trước NB :: . Khu vực của không gian tên kết hợp cho Bắc Mỹ và toàn cầu tiếp tục bên dưới fn () định nghĩa và vào chủ chốt() chức năng cho đến cuối tệp.

Phần mở rộng của không gian tên NB bắt đầu từ int myVar2 = NB :: func (); bên trong fn () chặn và kết thúc ở cuối fn () khối định nghĩa.

Ghi chú: Không gian tên có các vùng được kết hợp không được có cùng tên biến trong các khối không gian tên khác nhau của chúng, vì điều này sẽ vẫn gây ra xung đột.

Vùng không gian tên

Không gian tên là một phạm vi. Ngoài không gian tên toàn cục (phạm vi toàn cầu), bất kỳ không gian tên nào cũng phải được khai báo trong một khối. Khối đó là phần đầu tiên của các vùng phân tán có thể có của không gian tên. Với chỉ thị using, không gian tên có thể được mở rộng như các vùng trong các phạm vi khác.

Các thực thể được khai báo trong phần thân không gian tên được cho là thành viên của không gian tên và các tên do các khai báo này đưa vào vùng khai báo của không gian tên được cho là tên thành viên của không gian tên.

Không gian tên lồng nhau

Chương trình sau đây hiển thị các không gian tên lồng nhau:

#bao gồm
sử dụng không gian tên std;

không gian tên A
{
NStôi= 1;
không gian tên B
{
NStôi= 2;
không gian tên C
{
NStôi= 3;
}
}
}

NSchủ chốt()
{
Giá cả<<ĐẾN::tôi << '' <<ĐẾN::NS::tôi << '' <<ĐẾN::NS::NS::tôi << ' ';

trở lại 0;
}

Đầu ra là:

1 2 3

Lưu ý rằng ba giá trị đã được truy cập bằng toán tử phân giải phạm vi.

Không gian tên chuẩn

C ++ có một thư viện được gọi là thư viện chuẩn. Tên của các đối tượng, hàm và các thực thể khác trong thư viện này là từ một không gian tên được gọi là không gian tên chuẩn, được viết dưới dạng giờ . Thư viện chuẩn chứa các thư viện con và một trong các thư viện con này là iostream . Các iostream thư viện chứa đối tượng Giá cả , được sử dụng để gửi kết quả đến bảng điều khiển (thiết bị đầu cuối).

Tên Giá cả phải ở trong giờ không gian tên. Để sử dụng iostream với nó giờ không gian tên, chương trình phải như sau:

#bao gồm
sử dụng không gian tên std;

Lưu ý việc sử dụng sử dụng chỉ thị và giờ . Thời hạn #bao gồm là một chỉ thị tiền xử lý và không kết thúc bằng dấu chấm phẩy. Nó bao gồm tệp iostream ở vị trí chỉ thị của nó.

Phần kết luận

Không gian tên là một phạm vi. Mô tả không gian tên (định nghĩa) chứa các khai báo và / hoặc định nghĩa cơ bản của các đối tượng C ++, các hàm và các thực thể khác. Bên ngoài định nghĩa không gian tên, tên có thể được truy cập bằng cú pháp, namespaceName :: name . Ngoài không gian tên toàn cục (phạm vi toàn cầu), bất kỳ không gian tên nào cũng phải được khai báo trong một khối. Khối đó là phần đầu tiên của các vùng phân tán có thể có của không gian tên. Với sử dụng chỉ thị, không gian tên có thể được mở rộng như các vùng trong các phạm vi khác. Không gian tên có các vùng được kết hợp không được có cùng tên biến trong các khối không gian tên khác nhau của chúng, vì điều này sẽ vẫn gây ra xung đột tên.

Chrys