我們在寫程式時會用到各種類和函式,這些名字難免會有衝突,尤其是大型專案,更避免不了重名的問題。所以,當有重名的時候,就引入了命名空間的概念。
由於這種機制對於宣告於其中的名稱都進行了本地化,就使得相同的名稱可以在不同的上下文中使用,而不會引起名稱的衝突。
命名空間就是乙個作用域,我們在使用這個作用域中的內容時,可以先用using宣告(指示)或者直接使用 命名空間名::內容 來操作
比如下面的兩種方式:
using namespace std;
....
cout<<"hello world!"《或者
std::cout<<"hello world!"<
當我們自己使用命名空間的時候,如果是在命名空間外部使用,那麼就必須將命名空間引入或者加上字首。但是如果我們在命名空間內部使用命名空間中的內容時,就可以不用新增字首或引入命名空間。
定義命名空間 使用namespace關鍵字,後面跟隨命名空間名字,然後使用大括號將內容括起來。
例子: //
#include "stdafx.h"
#include #include #include using namespace std;
namespace ns1
i在本檔案中相當於乙個static變數。
5.命名空間可以定義成乙個別名(尤其是子命名空間比較長時,用乙個別名可以省去不少麻煩):
namespace ns = ns1;
1.using宣告是只引入要用的部分,使用 using + 命名空間名::要引入的內容。
例如:
//命名空間宣告,只引入要用的部分
using ns1::hellonamespace;
hellonamespace();
2.using指示:將整個命名空間的內容引入。
using namespace std;
使用命名空間主要是為了防止名字衝突,如果隨意使用using指示注入命名空間的所有名字,將重新引入名字衝突的問題。另外,using宣告和using指示在作用域上有區別:
using宣告是將乙個成員引入當前命名空間作用域內;using指示是將所有成員引入當前和上一層命名空間作用域內
例如://#include "stdafx.h"
#include #include #include using namespace std;
namespace ns1
則會報出如下錯誤:
intellisense: 有多個 過載函式 "helloworld" 例項與引數列表匹配:
函式 "helloworld()"
函式 "ns1::helloworld()"
34可見using namespace引入的命名空間在更上一層也是有效的。
using與過載:
using引入的是乙個名字,而不是具體的函式。所以如果我們要引入的函式存在過載的話,引入該名字,會將該函式的所有過載版本都引入到命名空間中。
讀書筆記之 命名空間
c 程式中,每提及乙個 名稱 編譯器就要對這個 名稱 進行 決議 resolve 簡言之,就是要讓 這個 名稱 可見 visible 舉例說明一下 console.writeline hello edgarsun 此時編譯器將無法對console這一名稱進行 決議 using指令提供了一種解決方法,...
C primer 讀書筆記
第2 章 變數和基本型別 1 變數直接初始化和變數 複製初始化 int ival 1024 direct initialization int ival 1024 copy initialization 初始化不是賦值 2 內建型別復 制初始化和直接初始化幾乎沒有區別 但 對類型別物件來 說,有些初...
C Primer讀書筆記
前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...