[C++] namespace命名空間和using用法

命名空間namespace:指標識符的各類可見範圍。ios

C++標準程序庫中的全部標識符都被定義在一個std的namespace,這就是程序開始添加 using namespace std; 的緣由。函數

不少人共同完成一套代碼,不可能不出現標識符命名相同的問題,爲了解決衝突問題,產生了命名空間namespace。spa

 

命名空間包括又名命名空間和無名命名空間code

 

1、有名命名空間blog

有名命名空間的定義格式:io

namespace 空間名 { code } // 有名命名空間的嵌套定義
namespace 空間名1 { code namespace 空間名2 { code } }

 

有名命名空間的使用格式:編譯

// 直接使用"::"鏈接空間名和code
空間名:: code;    // code爲變量或函數

 

有名命名空間取別名爲了方便使用,定義格式以下:class

namespace 別名 = 空間名;

 

using 指令使用格式:stream

// 表示後面代碼都使用此命名空間,若是屬空於本空間,無需再使用"::"鏈接空間名和code
using namespace 空間名; // 空間名支持嵌套 //最經常使用的std空間
using namespace std;

 

舉例:變量

#include <iostream>
// 使用std命名空間下的變量
using namespace std; int a = 5; namespace A { int a = 10; // 命名空間支持嵌套定義
    namespace B { int a = 15; int b = 20; } // 命名空間能夠重複定義,至關於擴充
    namespace B { int x = 30; int y = 35; } } namespace C { int a = 25; // 錯誤,命名空間不能嵌套聲明 // namespace D;
} int main(void) { // 若是不寫using namespace std,就必須加前綴std::
    std::cout << "Hello World!" << std::endl; cout << endl;    // 換行
 cout << "a = " << a << endl; cout << "A::a = " << A::a << endl; cout << "A::B::a = " << A::B::a << endl; cout << "C::a = " << C::a << endl; // 錯誤,提示變量b沒有聲明 // cout << "b = " << b << endl;
 cout << endl; // 命名空間取別名
    namespace AB = A::B; cout << "AB = A::B" << endl; cout << "AB::a = " << AB::a << endl; cout << "AB::b = " << AB::b << endl; cout << endl; // 後面的代碼使用A::B命名空間下的變量
    using namespace A::B; cout << "使用A::B命名空間" << endl; cout << "b = " << b << endl; cout << "x = " << x << endl; cout << "y = " << y << endl; return 0; }

執行結果:

 

2、無名命名空間

命名空間不只能夠避免名稱衝突,還能夠是代碼保持局部性,從而保護代碼不被他人非法使用。

在當前的編譯單元直接使用無名命名空間中的成員,可是在當前編譯單元以外,它是不可見的

 

無名命名空間定義格式:

namespace { code }

 

舉例:

#include <iostream>
// 使用std命名空間下的變量
using namespace std; // 若是定義與無名命名空間相同,則會產生衝突報錯 //int a = 5;

namespace { int a = 10; int b = 20; namespace B { int a = 30; int b = 40; } int add(int a, int b) { return (a + b); } } int main(void) { // 默認使用無名命名空間中的變量和空間
    cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "B::a = " << B::a << endl; cout << "B::b = " << B::b << endl; cout << endl; cout << "a + b = " << add(a, b) << endl; cout << "B::a + B::b = " << add(B::a, B::b) << endl; return 0; }

執行結果:

 

總結:

一、命名空間能夠嵌套定義,但不能嵌套聲明;

二、能夠屢次聲明和定義同一命名空間,至關於擴充,並添加新成員;

三、無名命名空間中的成員不能與同一文件中外部的成員相同;

四、無名命名空間中的成員使用方式與全局變量使用方式相同。

相關文章
相關標籤/搜索