C++語言基礎(chǔ) 命名空間
C++的命名空間的使用
C++語言引入命名空間(Namespace)這一概念主要是為了避免命名沖突,其關(guān)鍵字為 namespace。
科技發(fā)展到如今,一個(gè)系統(tǒng)通常都不會(huì)僅由一個(gè)人來開發(fā)完成,不同的人開發(fā)同一個(gè)系統(tǒng),不可避免地會(huì)出現(xiàn)變量或函數(shù)的命名沖突,當(dāng)所有人的代碼測試通過,沒有問題時(shí),將所有人的代碼結(jié)合到一起,因?yàn)樽兞炕蚝瘮?shù)重名而導(dǎo)致的問題將會(huì)造成一定的混亂,例如:
int flag = 1; //小李聲明的變量
// …… //中間間隔若干行代碼
bool flag = true; //小韓聲明的變量
注意:此例僅為解釋命名空間所用,在公司的系統(tǒng)開發(fā)中并非如此中所述,完全僅靠命名空間來解決命名沖突的,具體編程規(guī)范可以參考林銳的《高質(zhì)量程序設(shè)計(jì)指南》一書。
如上所示,因?yàn)閭€(gè)人習(xí)慣不同,小李喜歡聲明int型變量用于邏輯判斷,而小韓則更喜歡采用bool類型變量。但兩個(gè)聲明放到同一個(gè)函數(shù)中的時(shí)候,很明顯編譯器會(huì)提示出flag變量重新定義的錯(cuò)誤。這種問題若不加以處理是無法編譯通過的。
可以使用命名空間解決類似上面的命名沖突問題,例如:
namespace Li{ //小李的變量聲明
int flag = 1;
}
namespace Han{ //小韓的變量聲明
bool flag = true;
}
小李與小韓各自定義了以自己姓氏為名的命名空間,此時(shí)將小李與小韓的flag變量定義再置于同一個(gè)函數(shù)體中,則不會(huì)有任何問題,當(dāng)然在使用這兩個(gè)變量的時(shí)候需要指明所采用的是哪一個(gè)命名空間中的flag變量。
指定所使用的變量時(shí)需要用到“::”操作符,“::”操作符是域解析操作符。例如:
Li::flag = 0; //使用小李定義的變量flag
Han::flag = false; //使用小韓定義的變量flag
我們已經(jīng)定義了兩個(gè)命名空間 Li 和 Han,并在其中各自聲明flag變量,使用的時(shí)候則需要分別用域解析操作符指明此時(shí)用的flag變量是誰定義出來的flag變量,是小韓還是小李定義的。
除了直接使用域解析操作符,還可以采用using聲明(using declaration),例如:
using Li::flag;
flag = 0; //使用小李定義的變量flag
Han::flag = false; //使用小韓定義的變量flag
在代碼的開頭用using聲明了Li::flag,其含義是using聲明以后的程序中如果出現(xiàn)未指明的flag時(shí),則使用Li::flag,但是若要使用小韓定義的flag,則仍需要Han::flag。
using聲明不僅僅可以針對命名空間中的一個(gè)變量,也可以用于聲明整個(gè)命名空間,例如:
using namespace Li;
flag = 0; //使用小李定義的變量flag
Han::flag = false; //使用小韓定義的變量flag
如果命名空間Li中還定義了其他的變量,則同樣具有flag變量的效果,在using聲明后,若出現(xiàn)未具體指定命名空間的命名沖突變量,則默認(rèn)采用Li命名空間中的變量。
命名空間內(nèi)部不僅可以聲明或定義變量,對于其它能在命名空間以外聲明或定義的實(shí)體,同樣也都能在命名空間內(nèi)部進(jìn)行聲明或定義,例如變量的聲明或定義、函數(shù)的聲明或定義、typedef等都可以出現(xiàn)在命名空間中。
下面我們來看一個(gè)簡單的C++程序的示例:
#include<iostream> using namespace std; int main(){ cout<<"hello world!"<<endl; return 0; }
這是一個(gè)簡單的C++程序hello world示例,在程序中采用了using聲明命名空間std,using namespace std; 這一語句涵蓋了std命名空間中的所有標(biāo)識(shí)符,而該命名空間包含C++所有標(biāo)準(zhǔn)庫。頭文件iostream文件中定義的所有變量、函數(shù)等都位于std命名空間中,每次使用iostream中的變量或函數(shù)都需要在前面加上std::是非常麻煩的一件事,為此可直接用using聲明將std中的所有變量或函數(shù)等都聲明出來。
如果不用using namespace std;這一語句,則程序應(yīng)該像下面這樣:
#include<iostream> int main(){ std::cout<<"hello world!"<<std::endl; return 0; }
這樣看起來是相當(dāng)麻煩的,如果在某次使用iostream中變量或函數(shù)時(shí)漏掉std則會(huì)導(dǎo)致為定義標(biāo)識(shí)符錯(cuò)誤。
C++語言是以C語言為基礎(chǔ)的,它繼承了所有的C語言函數(shù)庫,但C++對這些標(biāo)準(zhǔn)庫都重新命名了。標(biāo)準(zhǔn)C頭文件(如math.h)重命名為cmath,去掉頭文件的.h,并在前面加上c。因此在C++中如需使用math.h頭文件則可以按照如下方式使用。
#include<cmath>
using namespace std;
以下的 是我的簡單的工程代碼
namespace 頭文件的代碼
#ifndef NAMESPACE_H #define NAMESPACE_H namespace Li{ //小李的變量聲明 int flag = 1; } namespace Han{ //小韓的變量聲明 bool flag = true; } #endif // NAMESPACE_H
主函數(shù)的代碼
#include <iostream> #include "namespace.h" using namespace std; using namespace Li; int main(int argc, char *argv[]) { cout << Li::flag << endl; Li::flag = 9; cout << Li::flag << endl; return 0; }
輸出的結(jié)果是
下面是其他網(wǎng)友的補(bǔ)充
一個(gè)中大型軟件往往由多名程序員共同開發(fā),會(huì)使用大量的變量和函數(shù),當(dāng)有兩個(gè)人都同時(shí)定義了一個(gè)名字相同的全局變量或函數(shù)的時(shí)候,若是把他們的代碼整合在一塊編譯,此時(shí)編譯器就會(huì)提示變量或函數(shù)重復(fù)定義,C++為了解決這個(gè)問題,便引用了命名空間(namespace)的概念。
一.語法格式
namespace 是C++中的關(guān)鍵字,用來定義一個(gè)命名空間,語法格式為:
namespace name{ //variables, functions, classes }
name是命名空間的名字,它里面可以包含變量、函數(shù)、類、typedef、#define 等,最后由{ }包圍。
注意:也可以不用寫name,若定義了一個(gè)沒有名字的命名空間,則其內(nèi)部的代碼只能在這個(gè)文件里面用。
namespace { int myAge = 0; }
二.使用方法
若要使用命名空間中定義的變量或函數(shù),需要指名它們所在的命名空間,如:
#include <stdio.h> #include <iostream> using namespace std; namespace DJ{ int myAge = 0; } int main() { DJ::myAge = 5; cout << "my age is: "<< DJ::myAge << endl; return 0; }
::
是一個(gè)新符號,稱為域解析操作符,在C++中用來指明要使用的命名空間。
還可以這樣寫(直接使用using
聲明):
#include <stdio.h> #include <iostream> using namespace std; namespace DJ{ int myAge = 0; } int main() { using DJ::myAge; myAge = 5; cout << "my age is: "<< myAge << endl; return 0; }
在代碼的開頭使用using聲明DJ:myAge,這樣如果接下來的代碼中出現(xiàn)了未指明命名空間的myAge,就使用DJ:myAge,不過要使用別的命名空間中定義的myAge,則仍然需要顯示聲明。
還可以寫成這樣:
#include <stdio.h> #include <iostream> using namespace std; namespace DJ{ int myAge = 0; } int main() { using namespace DJ; myAge = 5; cout << "my age is: "<< myAge << endl; return 0; }
如果命名空間 DJ中定義的其他的變量,樣具有 myAge變量的效果。
命名空間內(nèi)部不僅可以聲明或定義變量,對于其它能在命名空間以外聲明或定義的名稱,同樣也都能在命名空間內(nèi)部進(jìn)行聲明或定義,例如類、函數(shù)、typedef、#define 等都可以出現(xiàn)在命名空間中。
三.std命名空間
新建一個(gè)純C++項(xiàng)目(QT)時(shí),QT默認(rèn)新建的main.cpp文件如下:
#include <iostream> using namespace std; int main() { cout << "Hello World!" << endl; return 0; }
其實(shí)是省略了cout的命名空間,也可以寫成這樣:
#include <iostream> int main() { std::cout << "Hello World!" << std::endl; return 0; }
相關(guān)文章
VsCode搭建C語言運(yùn)行環(huán)境詳細(xì)過程及終端亂碼問題解決方案
這篇文章主要介紹了VsCode搭建C語言運(yùn)行環(huán)境以及終端亂碼問題解決,在VsCode中搭建C/C++運(yùn)行環(huán)境需要先安裝幾個(gè)插件,具體插件文中給大家詳細(xì)介紹,需要的朋友可以參考下2022-12-12C++圖論之Bellman-Ford算法和SPFA算法的實(shí)現(xiàn)
貝爾曼-福特算法(Bellman-Ford)是由理查德·貝爾曼和萊斯特·福特創(chuàng)立的,求解單源最短路徑問題的一種算法。SPFA 算法是 Bellman-Ford算法 的隊(duì)列優(yōu)化算法的別稱,通常用于求含負(fù)權(quán)邊的單源最短路徑。本文將詳解兩個(gè)算法的實(shí)現(xiàn),需要的可以參考一下2022-06-06C++中std::ios_base::floatfield報(bào)錯(cuò)已解決
在C++編程中,設(shè)置浮點(diǎn)數(shù)輸出格式時(shí)可能遇到std::ios_base::floatfield錯(cuò)誤,解決方法包括使用正確的格式化標(biāo)志組合,避免沖突的格式化設(shè)置,以及檢查流狀態(tài)標(biāo)志是否正確,通過這些方法可以有效避免浮點(diǎn)數(shù)格式化錯(cuò)誤,并確保輸出精確2024-09-09OpenCV?直方圖均衡化的實(shí)現(xiàn)原理解析
直方圖均衡化是通過拉伸像素強(qiáng)度分布范圍來增強(qiáng)圖像對比度的一種方法,今天通過本文給大家介紹OpenCV?直方圖均衡化的實(shí)現(xiàn)原理解析,感興趣的朋友跟隨小編一起看看吧2022-01-01C語言算法練習(xí)之折半查找的實(shí)現(xiàn)
二分查找法(也叫折半查找)其本質(zhì)是分治算法的一種。這篇文章主要介紹了如何利用C語言實(shí)現(xiàn)折半查找,感興趣的小伙伴可以學(xué)習(xí)一下2022-05-05Java C++ 算法題解leetcode1608特殊數(shù)組特征值
這篇文章主要為大家介紹了Java C++ 算法題解拓展leetcode1608特殊數(shù)組特征值實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09