C++命名空間 namespace詳解
一、命名空間的定義
定義命名空間,使用namespace關(guān)鍵字,后面跟命名空間的名字,然后接一對(duì)花括號(hào){ } 即可,{ }中即為命名空間的成員。
1.一般定義
namespace test { int a = 10; int b = 100; int ADD(int x, int y) { return x + y; } }
2.嵌套定義
namespace test { int a = 10; int b = 100; int Add(int x, int y) { return x + y; } namespace test2 { int c(99); int d(9); //c++可以使用括號(hào)來進(jìn)行列表初始化 int Sub(int x, int y) { return x - y; } } }
3.重名定義
同一個(gè)工程中允許存在多個(gè)相同名稱的命名空間,編譯器最后會(huì)合成同一個(gè)命名空間中。
例如:
namespace N1 //N1是命名空間的名稱 { //用花括號(hào){ }將命名空間的內(nèi)容包起來 //命名空間的內(nèi)容,即可以定義變量,也可以定義函數(shù) int a; int Add(int x, int y) { return x + y; } } namespace N1 //再次定義命名空間 N1 { int Mul(int x, int y) { return x * y; } }
實(shí)際上等同于:
namespace N1 //N1是命名空間的名稱 { //用花括號(hào){ }將命名空間的內(nèi)容包起來 //命名空間的內(nèi)容,即可以定義變量,也可以定義函數(shù) int a; int Add(int x, int y) { return x + y; } int Mul(int x, int y) { return x * y; } }
二、命名空間的使用
C++為了防止命名沖突,把自己庫里面的東西都定義在一個(gè)std的命名空間中要使用標(biāo)準(zhǔn)庫里面的東西,有三種方式:
- 加命名空間的名稱及作用域限定符。
- 使用using引入命名空間的成員。
- 使用using namespace 命名空間名稱引入,將所有名稱全展開。
1.命名空間的名稱及作用域限定符
代碼如下:
namespace test { int a = 10; int b = 100; int Add(int x, int y) { return x + y; } namespace test2 { int c(99); //c++可以使用括號(hào)來進(jìn)行初始化 int d(9); int Sub(int x, int y) { return x - y; } } } int main() { std::cout << test::Add(test::a, test::b) << std::endl; std::cout << test::test2::Sub(test::test2::c, test::test2::d) << std::endl; return 0; }
指定命名空間–麻煩,每個(gè)地方都要指定,但也是最規(guī)范的方式。
2.使用using namespace 命名空間全展開
代碼如下:
using namespace std;
把std整個(gè)展開,相當(dāng)于庫里面的東西全部到全局域里面去了,使用起來方便但是可能會(huì)有與自己命名空間定義的沖突,規(guī)范工程中不推薦這種,日常練習(xí)可以用這種。
3.使用using引入命名空間的成員
代碼如下:
int c = 100; namespace N { int a = 10; int b = 20; int Add(int left, int right) { return left + right; } int Sub(int left, int right) { return left - right; } } using std::cout; using std::endl; int main() { printf("%d\n", N::a); printf("%d\n", N::b); printf("%d\n", N::Add(1, 2)); printf("%d\n", N::Sub(1, 2)); int c = 10; printf("%d\n", c); //局部變量優(yōu)先,所以c為10 printf("%d\n", ::c); //指定訪問左邊域,空白表示全局域 }
對(duì)部分常用的庫里面的東西展開->針對(duì)1和2的折中方案,項(xiàng)目中也經(jīng)常使用。
到此這篇關(guān)于C++命名空間 namespace的文章就介紹到這了,更多相關(guān)命名空間 namespace內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ Boost Chrono實(shí)現(xiàn)計(jì)時(shí)碼表流程詳解
Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱2022-11-11C語言 深入探究動(dòng)態(tài)規(guī)劃之區(qū)間DP
這幾天在做有關(guān)dp的題,看到一個(gè)石子合并的問題,本來以為是個(gè)貪心,后來仔細(xì)一想壓根不是貪心。貪心算法的思路是每次都取最大的,然而石子合并問題有個(gè)限制條件就是每次只能取相鄰的,這就決定了它不是個(gè)貪心2022-04-04