Tìm hiểu về khái niệm namespace trong C++

Spread the love

Namespace là một cơ chế quan trọng trong ngôn ngữ lập trình C++, giúp nhóm các thực thể (class, object, function…) có liên quan lại với nhau theo từng nhóm khác nhau dựa trên tên, trong đó tên của mọi thực thể trong mỗi namespace đều được gắn thêm tên của namespace đó làm tiền tố.

Có thể bạn quan tâm

    Namespace và công dụng của nó

    Trong C++, không sử dụng namespace (hoặc sử dụng chung một namespace) có thể gây ra một số vấn đề. Ví dụ, giả sử chúng ta có hai thư viện lib1.h và lib2.h, mỗi thư viện đều có một lớp String. Khi đó, không thể sử dụng cả hai thư viện lib1.h và lib2.h cùng lúc. Trình biên dịch sẽ báo lỗi hoặc không thể phân biệt được hai lớp String này.

    Tuy nhiên, sử dụng namespace sẽ giải quyết được vấn đề trên. Chúng ta có thể định nghĩa các lớp trong từng namespace riêng biệt. Sau đó, có thể gọi các lớp này bằng toán tử quan hệ (::) như sau:

    int main() {
        // ...
        lib1::String a; // Lớp String trong lib1.h
        lib2::String b; // Lớp String trong lib2.h
        // ...
        return 0;
    }

    Không chỉ giới hạn ở việc sử dụng namespace cho các class, chúng ta cũng có thể tổ chức các namespace theo dạng cây cho các đối tượng hay hàm. Ví dụ:

    namespace stdio {
        // Biến toàn cục
        string whatsNew;
    
        namespace founders {
            namespace kevin {
                void submitTopic() {
                    // ...
                }
                // ...
            }
            // ...
        }
    
        namespace authors {
            namespace amy {
                // ...
                // có thể sử dụng submitTopic thông qua stdio::founders::kevin::submitTopic
            }
    
            namespace rye {
                class BasicGuide {
                    // ...
                }
                // có thể sử dụng BasicGuide thông qua stdio::authors::rye::BasicGuide
            }
    
            namespace frederick {
                // ...
                // có thể sử dụng submitTopic thông qua stdio::founders::kevin::submitTopic
            }
            // ...
        }
        // ...
    }

    Khi đó, chúng ta có thể gọi đến biến whatsNew, lớp BasicGuide và 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 bất kỳ namespace nào.

    Từ khóa Using

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

    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 {
        // ...
        namespace authors {
            namespace amy {
                // có thể sử dụng submitTopic thông qua using stdio::founders::kevin::submitTopic;
            }
            // ...
        }
        // ...
    }

    Và như vậy, chúng ta có thể gọi hàm submitTopic như sau:

    stdio::authors::amy::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ã “không cần đến nó”, hoàn toàn có thể viết như sau:

    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 được sử dụng và được định nghĩa sẵn trong thư viện iostream thuộc các phiên bản C++ standard. Điều này giúp 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…

    More From Author