C++中命名空間的概念及使用詳解
什么是命名空間?
字面意思來理解,命名空間主要有兩個點(diǎn)——“名字”和“空間”。
通過這兩個關(guān)鍵詞,我給大家簡單描述一下什么是命名空間(看下面↓)
舉個例子:
有一個學(xué)校,世界之大無奇不有,恰恰這個學(xué)校就比較奇怪。那你可能就會問了,這個學(xué)校究竟奇怪在哪里?這個學(xué)校奇怪的就是不僅有很多生日相同的學(xué)生,還有不少同學(xué)重名重姓。然后有一天放學(xué),學(xué)校里有人撿到了一個錢包,里面有張三的學(xué)生證,這個錢包就被送到了校長手里,校長看著學(xué)生這么懂事,對其大加贊賞,于是便打開廣播同時向各班表揚(yáng)了這名學(xué)生,并且讓名叫張三的學(xué)生來校長辦公室一趟。過了幾分鐘,校長打開門一看,門外站了七八個大漢,原來這些分別都是二三四各個班的張三,還有各個年級的張三,校長瞬間蒙圈,也不知道自己叫的是哪個張三了。
故事講完了,上面的各個班級各個年級就是不同的“空間”,張三就是一個“名字”,那個蒙圈的校長自然就是編譯器啦。“校長”蒙圈,程序自然就無法正常的執(zhí)行了。那么為什么校長沒有找到真正的張三呢?原因就在于各個空間中的變量、函數(shù)、類命名發(fā)生了沖突、命名被相互污染了,所以為了解決這種問題,我們就加入了命名空間。之后校長再要找張三,他就會在廣播上喊高二三班的張三來我辦公室一下,就可以精確的找到需要找的內(nèi)容了。
概念
在C/C++中,變量、函數(shù)和后面要學(xué)到的類都是大量存在的,這些變量、函數(shù)和類的名稱將都存在于全局作 用域中,可能會導(dǎo)致很多沖突。
使用命名空間的目的是對標(biāo)識符的名稱進(jìn)行本地化,以避免命名沖突或名字 污染,namespace關(guān)鍵字就是針對這種問題而出現(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. 同一個工程中允許存在多個相同名稱的命名空間(編譯器會合成到同一個命名空間)
// 編譯器最后會合成同一個命名空間中 namespace N1 { int Mul(int left, int right) { return left * right; } }
一個命名空間就定義了一個新的作用域,命名空間中的所有內(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于C++執(zhí)行內(nèi)存memcpy效率測試的分析
本篇文章對C++中執(zhí)行內(nèi)存memcpy的效率進(jìn)行了分析測試。需要的朋友參考下2013-05-05解析C++的線性表鏈?zhǔn)酱鎯υO(shè)計(jì)與相關(guān)的API實(shí)現(xiàn)
這篇文章主要介紹了解析C++中的線性表鏈?zhǔn)酱鎯υO(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)用類對象和線程傳參的方法
這篇文章主要介紹了C++11/14 線程調(diào)用類對象和線程傳參的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01從c++標(biāo)準(zhǔn)庫指針萃取器談一下traits技法(推薦)
本篇文章基于gcc中標(biāo)準(zhǔn)庫源碼剖析一下標(biāo)準(zhǔn)庫中的模板類pointer_traits,并且以此為例理解一下traits技法,對c++ traits技法源碼分析感興趣的朋友跟隨小編一起看看吧2021-07-07