STDIO
Tìm kiếm gần đây
    Nội dung
    0
    0
    Chia sẻ
    Nội dung
    0
    0
    Chia sẻ

    Từ Khóa namespace

    Tìm hiểu về cơ chế namespace trong C++.
    18/08/2015 06/09/2020 4 phút đọc
    Từ Khóa namespace

    Namespace là gì?

    Namespace là một cơ chế trong C++, cho phép nhóm các thực thể (class, object, function…) có liên quan thành từng nhóm khác nhau theo tên, mà theo đó tên của mọi thực thể trong mỗi namespace đều được gắn thêm tên của namespace đó như tiền tố.

    Namespace dùng để làm gì?

    Trong C++, không sử dụng namespace (hay có thể hiểu là dùng chung một namespace) có thể gây ra một số rắc rối. Chẳng hạn trong ví dụ:

    // lib1.h
    class String
    {
        // some helpful functions
    };
    
    // lib2.h
    class String
    {
        // some others helpful functions
    };

    Giả sử cần cả 2 lớp để xử lý một vấn đề liên quan đến chuỗi. Lúc này dễ dàng thấy được là không thể sử dụng cả 2 thư viện lib1.h và lib2.h cùng lúc. Do trình biên dịch sẽ báo là lớp String được khai báo lại, hoặc giả trình biên dịch không báo lỗi thì ta cũng không thể phân biệt được 2 lớp String này.

    Lúc này, sử dụng namespace sẽ giải quyết được vấn đề trên:

    // lib1.h
    namespace lib1
    {
        class String
        {
            // ...
        };
    }
    
    // lib2.h
    namespace lib2
    {
        class String
        {
            // some others helpful functions
        };
    }

    Sau khi định nghĩa như vậy, có thể gọi các lớp trên bằng toán tử quan hệ (::) như sau:

    int main()
    {
        // do something
        lib1::String a; // the String class in lib1.h
        lib2::String b; // the String class in lib2.h
        // dosomething
        return 0;
    }

    Không chỉ giới hạn ở 1 namespace và các class, cũng có thể tổ chức các namespace theo dạng cây cho các đối tượng hay hàm, như trong ví dụ sau:

    namespace stdio
    {
    	// News
    	string whatsNew; 
    
    	namespace founders
    	{
    		namespace kevin
    		{
    			void submitTopic()
    			{
    				// do something
    			}
    		}
    		// ...
    	}
    
    	namespace authors
    	{
    		namespace amy
    		{
    		}
    
    		namespace rye
    		{
    			class BasicGuide
    			{
    				// something
    			};
    		}
    
    		namespace frederick
    		{
    		}
    	}
    // ...
    }

    Lúc này có thể gọi đến chuỗi News, lớp BasicGuide, hàm submitTopic như sau: 

    stdio::whatsNew;
    stdio::authors::rye::BasicGuide PointerInCpp;
    stdio::founders::kevin::submitTopic();

    Lưu ý

    Một namespace có thể chứa một hoặc nhiều thực thể hay namespace khác, nhưng một thực thể không thể chứa trong nó bất kỳ namespace nào.

    Từ khóa Using

    Từ khóa using có 2 cách sử dụng, và được gọi với 2 tên khác nhau:

    • Using Declaration
    • Using Directive

    Using declaration

    Cách gọi

    using <tên namespace>::<tên thực thể>;

    Công dụng

    Khai báo này cho phép lập trình viên truy cập đến thực thể được khai báo thông qua tên namespace chứa khai báo.

    Ví dụ

    namespace stdio
    {
    	// News
    	string whatsNew;
    
    	namespace founders
    	{
    		namespace kevin
    		{
    			void submitTopic()
    			{
    				// do something
    			}
    		}
    		// ...
    	}
    
    	namespace authors
    	{
    		namespace amy
    		{
    			// be able to submit topics
    			using stdio::founders::kevin::submitTopic;
    		}
    
    		namespace rye
    		{
    			// be able to submit topics
    			using stdio::founders::kevin::submitTopic;
    			class BasicGuide
    			{
    				// something
    			};
    		}
    
    		namespace frederick
    		{
    			// be able to submit topics
    			using stdio::founders::kevin::submitTopic;
    		}
    	}
    // ...
    }

    Và như vậy có thể gọi hàm submitTopic như sau:

    stdio::authors::amy::submitTopic();
    stdio::authors::rye::submitTopic();
    stdio::authors::frederick::submitTopic();

    Using directive

    Cách gọi

    using namespace <tên namespace>;

    Công dụng

    • Cho phép người viết mã nguồn gọi các thực thể trong khối namespace được khai báo mà không cần gọi tên namespace đó.
    • Có tác dụng kể từ dòng nó được gọi.
    • Có thể được gọi nhiều lần tại nhiều vị trí khác nhau trong cùng một tập tin mã nguồn, và chúng có hiệu lực song song nhau.

    Ví dụ

    Xét ví dụ tại mục 2.1, rõ ràng phải gọi rất nhiều tên namespace khi các author gọi hàm submitTopic. để rút ngắn có thể viết như sau:


    using namespace stdio::authors;
    amy::submitTopic();
    rye::submitTopic();
    frederick::submitTopic();

    using directive là một cơ chế thông minh, nó sẽ không ảnh hưởng đến các dòng mã nguồn “không cần đến nó”, hoàn toàn có thể viết như sau:

    using namespace stdio::authors;
    
    amy::submitTopic();
    rye::submitTopic();
    frederick::submitTopic();
    stdio::founders::kevin::submitTopic();
    
    // or
    
    using namespace stdio::authors;
    using namespace stdio::founders;
    
    amy::submitTopic();
    rye::submitTopic();
    frederick::submitTopic();
    
    kevin::submitTopic();

    using namespace std;

    std (standard) là một gói các thực thể thường dùng được định nghĩa sẵn trong thư viện iostream thuộc các phiên bản C++ standard để tiện cho lập trình viên khi sử dụng và tránh các lỗi khai báo trùng. Một số thực thể trong std: cout, cin, string, abs, sin, cos, tan, malloc

    0 Bình luận
    Modern C++

    Modern C++

    STDIO Training - Đào Tạo Lập Trình C++.

    Khi bạn nhấn vào sản phẩm do chúng tôi đề xuất và mua hàng, chúng tôi sẽ nhận được hoa hồng. Điều này hỗ trợ chúng tôi có thêm kinh phí tạo nhiều nội dung hữu ích. Tìm hiểu thêm.
    STDIO

    Trang chính

    Công ty TNHH STDIO

    • 30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
      +84 28.36205514 - +84 942.111912
      developer@stdio.vn
    • 383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
      Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012
    ©STDIO, 2013 - 2021