C++中命名空間的概念及使用詳解
什么是命名空間?
字面意思來理解,命名空間主要有兩個(gè)點(diǎn)——“名字”和“空間”。
通過這兩個(gè)關(guān)鍵詞,我給大家簡(jiǎn)單描述一下什么是命名空間(看下面↓)
舉個(gè)例子:
有一個(gè)學(xué)校,世界之大無奇不有,恰恰這個(gè)學(xué)校就比較奇怪。那你可能就會(huì)問了,這個(gè)學(xué)校究竟奇怪在哪里?這個(gè)學(xué)校奇怪的就是不僅有很多生日相同的學(xué)生,還有不少同學(xué)重名重姓。然后有一天放學(xué),學(xué)校里有人撿到了一個(gè)錢包,里面有張三的學(xué)生證,這個(gè)錢包就被送到了校長(zhǎng)手里,校長(zhǎng)看著學(xué)生這么懂事,對(duì)其大加贊賞,于是便打開廣播同時(shí)向各班表揚(yáng)了這名學(xué)生,并且讓名叫張三的學(xué)生來校長(zhǎng)辦公室一趟。過了幾分鐘,校長(zhǎng)打開門一看,門外站了七八個(gè)大漢,原來這些分別都是二三四各個(gè)班的張三,還有各個(gè)年級(jí)的張三,校長(zhǎng)瞬間蒙圈,也不知道自己叫的是哪個(gè)張三了。
故事講完了,上面的各個(gè)班級(jí)各個(gè)年級(jí)就是不同的“空間”,張三就是一個(gè)“名字”,那個(gè)蒙圈的校長(zhǎng)自然就是編譯器啦。“校長(zhǎng)”蒙圈,程序自然就無法正常的執(zhí)行了。那么為什么校長(zhǎng)沒有找到真正的張三呢?原因就在于各個(gè)空間中的變量、函數(shù)、類命名發(fā)生了沖突、命名被相互污染了,所以為了解決這種問題,我們就加入了命名空間。之后校長(zhǎng)再要找張三,他就會(huì)在廣播上喊高二三班的張三來我辦公室一下,就可以精確的找到需要找的內(nèi)容了。
概念
在C/C++中,變量、函數(shù)和后面要學(xué)到的類都是大量存在的,這些變量、函數(shù)和類的名稱將都存在于全局作 用域中,可能會(huì)導(dǎo)致很多沖突。
使用命名空間的目的是對(duì)標(biāo)識(shí)符的名稱進(jìn)行本地化,以避免命名沖突或名字 污染,namespace關(guān)鍵字就是針對(duì)這種問題而出現(xiàn)的。
定義
namespace + 命名空間名稱 + { 命名空間成員 }
特點(diǎn)
1. 普通的命名空間
namespace N1 // N1為命名空間的名稱 { // 命名空間中的內(nèi)容,既可以定義變量,也可以定義函數(shù) int a; int Add(int left, int right) { return left + right; } }
2.命名空間可以嵌套
namespace N2 { int a; int b; int Add(int left, int right) { return left + right; } namespace N3 { int c; int d; int Sub(int left, int right) { return left - right; } } }
3. 同一個(gè)工程中允許存在多個(gè)相同名稱的命名空間(編譯器會(huì)合成到同一個(gè)命名空間)
// 編譯器最后會(huì)合成同一個(gè)命名空間中 namespace N1 { int Mul(int left, int right) { return left * right; } }
一個(gè)命名空間就定義了一個(gè)新的作用域,命名空間中的所有內(nèi)容都局限于該命名空間中
命名空間的三種使用方式
1.加命名空間名稱及作用域限定符
int main() { printf("%d\n", N::a); return 0; }
2.使用using將命名空間中成員引入
using N::b; int main() { printf("%d\n", N::a); printf("%d\n", b); return 0; }
3.使用using namespace 命名空間名稱引入
using namespce N; int main() { printf("%d\n", N::a); printf("%d\n", b); Add(10, 20); return 0; }
到此這篇關(guān)于C++中命名空間的概念及使用詳解的文章就介紹到這了,更多相關(guān)C++中的命名空間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于C++執(zhí)行內(nèi)存memcpy效率測(cè)試的分析
本篇文章對(duì)C++中執(zhí)行內(nèi)存memcpy的效率進(jìn)行了分析測(cè)試。需要的朋友參考下2013-05-05解析C++的線性表鏈?zhǔn)酱鎯?chǔ)設(shè)計(jì)與相關(guān)的API實(shí)現(xiàn)
這篇文章主要介紹了解析C++中的線性表鏈?zhǔn)酱鎯?chǔ)設(shè)計(jì)與相關(guān)的API實(shí)現(xiàn),文中的實(shí)例很好地體現(xiàn)了如何創(chuàng)建和遍歷鏈表等基本操作,需要的朋友可以參考下2016-03-03C++輕松實(shí)現(xiàn)字符串與字符數(shù)組的相互轉(zhuǎn)換
本文詳細(xì)介紹了如何在C++中通過c_str()和strcpy()函數(shù)將字符串轉(zhuǎn)換為字符數(shù)組,以及使用for循環(huán)、+運(yùn)算符、重載=和內(nèi)置構(gòu)造函數(shù)將字符數(shù)組轉(zhuǎn)換為字符串的方法,需要的朋友可以參考下2025-03-03C++利用socket傳輸大文件的實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了C/C++如何使用socket傳輸大文件的實(shí)現(xiàn)代碼,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-10-10C++11/14 線程調(diào)用類對(duì)象和線程傳參的方法
這篇文章主要介紹了C++11/14 線程調(diào)用類對(duì)象和線程傳參的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01從c++標(biāo)準(zhǔn)庫(kù)指針萃取器談一下traits技法(推薦)
本篇文章基于gcc中標(biāo)準(zhǔn)庫(kù)源碼剖析一下標(biāo)準(zhǔn)庫(kù)中的模板類pointer_traits,并且以此為例理解一下traits技法,對(duì)c++ traits技法源碼分析感興趣的朋友跟隨小編一起看看吧2021-07-07