C++命名空間using?namespace?std是什么意思
一、 前言
C++中的using namespace std是什么意思呢?為了理解其中的含義,我們首先需要學(xué)習(xí)一個(gè)概念叫做命名空間。
我們都知道,C語(yǔ)言規(guī)定變量名不能與關(guān)鍵字沖突,但是并沒有規(guī)定變量名不能與庫(kù)中的變量名沖突,但這在實(shí)際的操作的過程中就會(huì)產(chǎn)生意想不到的錯(cuò)誤:
例如,將一個(gè)time變量放在main函數(shù)中,根據(jù)局部?jī)?yōu)先的原則,time變量就會(huì)被理解為一個(gè)局部變量。但當(dāng)time作為一個(gè)全局變量出現(xiàn)的時(shí)候,由于time庫(kù)中也含有一個(gè)名叫time的函數(shù)名,頭文件被展開后,此time被理解為變量名還是函數(shù)名就會(huì)產(chǎn)生歧義。

而C++中出現(xiàn)的命名空間概念就是為了填C語(yǔ)言中的這個(gè)坑。
?總結(jié):同一個(gè)域中不能出現(xiàn)兩個(gè)重名的變量名/函數(shù)名,而命名空間的提出就是為了對(duì)標(biāo)識(shí)符的名稱進(jìn)行本地化,以此解決命名污染的問題,其作用就是定義一個(gè)新的作用域
二、作用域分解運(yùn)算符
在講命名空間的時(shí)候首先給大家介紹一個(gè)作用域分解運(yùn)算符 " :: " 。
?使用說(shuō)明
A,B表示兩個(gè)類,而在A,B中都有成員member
- A :: member表示類A成員中的member
- B :: member表示類B成員中的member
當(dāng)前面的類不指定的時(shí)候,默認(rèn)為全局
前面說(shuō)到變量名沖突的時(shí)候遵循局部?jī)?yōu)先原則,那么我們能不能就想訪問到全局變量呢?我們就可以通過作用域分解運(yùn)算符實(shí)現(xiàn):

三、命名空間使用介紹
namespace my_variant
{
int time = 10;
}
int main()
{
printf("%d", my_variant::time);
}
?基本介紹①
- namespace是一個(gè)C++中的一個(gè)關(guān)鍵字
- 我們將變量定義在自己創(chuàng)建的my_variant命名空間,以避免被污染
- 訪問命名空間中的變量,需要使用作用域分解運(yùn)算符
- 命名空間只能定義在全局,其中定義的變量為全局變量
namespace my_variant
{
int time = 10;
typedef struct Stu
{
char name[10];
int age;
int score;
}Stu;
namespace _variant
{
int Add(int a, int b)
{
return a + b;
}
}
}
int main()
{
my_variant::Stu data = {0};
int ret = my_variant::_variant::Add(1, 2);
}
?基本介紹②
- 從上面我們可以看到命名空間中過的內(nèi)容不只局限于變量名,也可以是函數(shù)名,類型名
- 命名空間可以無(wú)限次嵌套命名空間,同樣的使用里面的內(nèi)容的時(shí)候也需要多次使用作用域分解運(yùn)算符——一層一層對(duì)應(yīng)的關(guān)系。使用嵌套命名空間可以解決命名空間內(nèi)部的命名沖突
- 一個(gè)工程中同名的命名空間最終會(huì)被合并為一個(gè)命名空間
當(dāng)然我們可以看到,每次要使用命名空間中的變量都需要寫很多額外的內(nèi)容,有沒有什么辦法可以簡(jiǎn)化操作呢——我們想要訪問命名空間中的space_b有兩種方法:
namespace space_a
{
int a1 = 1;
int a2 = 2;
namespace space_b
{
int b1 = 10;
int b2 = 20;
int b3 = 30;
}
namespace space_c
{
int c1 = 5;
int c2 = 6;
}
}
using namespace space_a; using namespace space_b;
方法①:首先將space_a中的內(nèi)容全部釋放出來(lái),再釋放其中的space_b的內(nèi)容(注意順序不能顛倒,否則space_b認(rèn)不出來(lái))
using namespace space_a:: space_b;
方法②:用什么放什么。只是將space_b中全部的內(nèi)容釋放出來(lái),而不會(huì)對(duì)其他的內(nèi)容產(chǎn)生影響。
釋放出來(lái)之后我們便可以愉快自由的使用了:

四、using namespace std
經(jīng)過上面的學(xué)習(xí),我們不難理解using name std的作用是釋放std命名空間中的變量名,函數(shù)名以及類型名,其中std是C++標(biāo)準(zhǔn)庫(kù)的命名空間。
我們?cè)跁鴮懘a的時(shí)候?yàn)榱朔奖阌谑菍++標(biāo)準(zhǔn)庫(kù)中的命名空間完全展開了,但是最好的做法我想還是用什么放什么。
另外,標(biāo)準(zhǔn)C++庫(kù)中提供兩種頭文件,前面以C開頭的頭文件是支持命名空間的,而后者是不支持的。

總結(jié)
到此這篇關(guān)于C++命名空間using namespace std是什么意思的文章就介紹到這了,更多相關(guān)C++命名空間using namespace std內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Visual Studio 2022 Preview 使用 C++20 Module的詳細(xì)過程
這篇文章主要介紹了Visual Studio 2022 Preview 使用 C++20 Module的過程,本文通過項(xiàng)目分析實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解2013-05-05
C++ DLL動(dòng)態(tài)庫(kù)的創(chuàng)建與調(diào)用(類庫(kù),隱式調(diào)用)
本文主要介紹了C++ DLL動(dòng)態(tài)庫(kù)的創(chuàng)建與調(diào)用(類庫(kù),隱式調(diào)用),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Qt QTreeWidget 樹形結(jié)構(gòu)實(shí)現(xiàn)代碼
Qt中實(shí)現(xiàn)樹形結(jié)構(gòu)可以使用QTreeWidget類,也可以使用QTreeView類,QTreeWidget繼承自QTreeView類,接下來(lái)通過本文給大家介紹Qt QTreeWidget 樹形結(jié)構(gòu)實(shí)現(xiàn)代碼,需要的朋友可以參考下2021-11-11
C語(yǔ)言實(shí)現(xiàn)消消樂游戲的代碼分享
本章我們將編寫十字消除游戲,用戶點(diǎn)擊空白方塊,沿其上下左右方向?qū)ふ业谝粋€(gè)彩色方塊,如果有兩個(gè)或兩個(gè)以上顏色一致,就將其消除,感興趣的可以了解一下2023-02-02

