C++命名空間using?namespace?std是什么意思
一、 前言
C++中的using namespace std
是什么意思呢?為了理解其中的含義,我們首先需要學(xué)習(xí)一個(gè)概念叫做命名空間。
我們都知道,C語言規(guī)定變量名不能與關(guān)鍵字沖突,但是并沒有規(guī)定變量名不能與庫中的變量名沖突,但這在實(shí)際的操作的過程中就會(huì)產(chǎn)生意想不到的錯(cuò)誤:
例如,將一個(gè)time變量放在main函數(shù)中,根據(jù)局部優(yōu)先的原則,time變量就會(huì)被理解為一個(gè)局部變量。但當(dāng)time作為一個(gè)全局變量出現(xiàn)的時(shí)候,由于time庫中也含有一個(gè)名叫time的函數(shù)名,頭文件被展開后,此time被理解為變量名還是函數(shù)名就會(huì)產(chǎn)生歧義。
而C++中出現(xiàn)的命名空間概念就是為了填C語言中的這個(gè)坑。
?總結(jié):同一個(gè)域中不能出現(xiàn)兩個(gè)重名的變量名/函數(shù)名,而命名空間的提出就是為了對標(biāo)識符的名稱進(jìn)行本地化,以此解決命名污染的問題,其作用就是定義一個(gè)新的作用域
二、作用域分解運(yùn)算符
在講命名空間的時(shí)候首先給大家介紹一個(gè)作用域分解運(yùn)算符 " :: " 。
?使用說明
A,B表示兩個(gè)類,而在A,B中都有成員member
- A :: member表示類A成員中的member
- B :: member表示類B成員中的member
當(dāng)前面的類不指定的時(shí)候,默認(rèn)為全局
前面說到變量名沖突的時(shí)候遵循局部優(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ù)名,類型名
- 命名空間可以無限次嵌套命名空間,同樣的使用里面的內(nèi)容的時(shí)候也需要多次使用作用域分解運(yùn)算符——一層一層對應(yīng)的關(guān)系。使用嵌套命名空間可以解決命名空間內(nèi)部的命名沖突
- 一個(gè)工程中同名的命名空間最終會(huì)被合并為一個(gè)命名空間
當(dāng)然我們可以看到,每次要使用命名空間中的變量都需要寫很多額外的內(nèi)容,有沒有什么辦法可以簡化操作呢——我們想要訪問命名空間中的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)容全部釋放出來,再釋放其中的space_b的內(nèi)容(注意順序不能顛倒,否則space_b認(rèn)不出來)
using namespace space_a:: space_b;
方法②:用什么放什么。只是將space_b中全部的內(nèi)容釋放出來,而不會(huì)對其他的內(nèi)容產(chǎn)生影響。
釋放出來之后我們便可以愉快自由的使用了:
四、using namespace std
經(jīng)過上面的學(xué)習(xí),我們不難理解using name std
的作用是釋放std命名空間中的變量名,函數(shù)名以及類型名,其中std是C++標(biāo)準(zhǔn)庫的命名空間。
我們在書寫代碼的時(shí)候?yàn)榱朔奖阌谑菍++標(biāo)準(zhǔn)庫中的命名空間完全展開了,但是最好的做法我想還是用什么放什么。
另外,標(biāo)準(zhǔn)C++庫中提供兩種頭文件,前面以C開頭的頭文件是支持命名空間的,而后者是不支持的。
總結(jié)
到此這篇關(guān)于C++命名空間using namespace std是什么意思的文章就介紹到這了,更多相關(guān)C++命名空間using namespace std內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++操作MySQL大量數(shù)據(jù)插入效率低下的解決方法
這篇文章主要介紹了C++操作MySQL大量數(shù)據(jù)插入效率低下的解決方法,需要的朋友可以參考下2014-07-07詳解C++ 拷貝構(gòu)造函數(shù)和賦值運(yùn)算符
本文主要介紹了拷貝構(gòu)造函數(shù)和賦值運(yùn)算符的區(qū)別,以及在什么時(shí)候調(diào)用拷貝構(gòu)造函數(shù)、什么情況下調(diào)用賦值運(yùn)算符。最后,簡單的分析了下深拷貝和淺拷貝的問題。有需要的朋友可以看下2016-12-12Microsoft Visual Studio 2022的安裝與使用詳細(xì)教程
Microsoft Visual Studio 2022是Microsoft Visual Studio軟件的一個(gè)高版本,能夠編寫和執(zhí)行C/C++代碼,具有強(qiáng)大的功能,是開發(fā)C/C++程序的主流軟件,這篇文章主要介紹了Microsoft Visual Studio 2022的安裝與使用詳細(xì)教程2024-01-01利用C語言實(shí)現(xiàn)順序表的實(shí)例操作
順序表是線性表中的一種重要的數(shù)據(jù)結(jié)構(gòu),也是最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),所以他不僅是學(xué)習(xí)中的重點(diǎn),也是應(yīng)用開發(fā)非常常用的一種數(shù)據(jù)結(jié)構(gòu)。這篇文章介紹如何利用C語言實(shí)現(xiàn)順序表。2016-08-08剖析C語言關(guān)鍵字之void,const,return
這篇文章主要為大家介紹了C語言關(guān)鍵字之void,const,return,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01關(guān)于雙向鏈表的增刪改查和排序的C++實(shí)現(xiàn)
下面小編就為大家?guī)硪黄P(guān)于雙向鏈表的增刪改查和排序的C++實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12