1、爲何使用命名空間ios
一個大型的工程每每是由若干我的獨立完成的,不一樣的人分別完成不一樣的部分,最後再組合成一個完整的程序。因爲各個頭文件是由不一樣的人設計的,有可能在不一樣的頭文件中用了相同的名字來命名所定義的類或函數,這樣在程序中就會出現名字衝突。不只如此,有可能咱們本身定義的名字會與C++庫中的名字發生衝突。ide
名字衝突就是在同一個做用域中有兩個或多個同名的實體,爲了解決命名衝突 ,C++中引入了命名空間,所謂命名空間就是一個能夠由用戶本身定義的做用域,在不一樣的做用域中能夠定義相同名字的變量,互不干擾,系統可以區分它們。函數
2、什麼是命名空間spa
命名空間是程序設計者命名的內存區域,程序設計者根據需指定一些有名字的空間域,把一些全局實體分別存放到各個命名空間中,從而與其餘全局實體分隔開。設計
通俗的說,每一個名字空間都是一個名字空間域,存放在名字空間域中的全局實體只在本空間域內有效。名字空間對全局實體加以域的限制,從而合理的解決命名衝突。對象
例:內存
namespace na作用域
{it
int a;io
char c;
}
則 a和c只在na的做用域內有效。
在聲明一個命名空間時,花括弧內不只能夠包含變量,並且還能夠包含如下類型:
變量(能夠帶有初始化)
常量
函數(能夠是定義或聲明)
結構體
類
模板
命名空間(命名空間能夠嵌套定義)
例:
namespacens1
{
int a;
char c = 10;
void fun();
int Add(int a, int b)
{
return a + b;
}
namespace ns2
{
int b;
}
}
注意,若是此時想輸出b,則須要指定外層和內層的命名空間
cout<<ns1::ns2::b<<endl;
3、使用命名空間成員的方法
一、在引用命名空間成員時,要用命名空間名和做用域解析符對命名空間成員進行限定,以區別不一樣的命名空間中同名標識符。即 命名空間名::命名空間成員名
二、還能夠給命名空間取別名
例:
namespace Television
{...}
namespace Tv=Television;
則Tv就是命名空間Television的別名,在之後用到Television的地方均可以用Tv進行替換。
三、使用using命名空間成員名
using後面的命名空間成員名必須是有命名空間限制的名字。
例:using ns1::a;
以上語句代表,在using的做用域內若是使用到ns1中的成員a,則沒必要再用命名空間限定。在之後的程序中若是用到a,則隱含的指ns1::a。 using聲明的做用域是從using語句開始,到using所在的做用域結束。要注意,在同一做用域內用using聲明的不一樣的命名空間的成員不能有同名的成員,不然會發生重定義。
四、使用using namespace 命名空間名
第三條介紹的using命名空間成員名,一次只能聲明一個命名空間成員,若是一個命名空間中有多個變量,就須要屢次使用using命名空間成員名。C++中還提供了using namespace 語句來實現一次聲明一個命名空間內的所有成員。
例如:
using namespace ns1;
聲明瞭在本做用域中要用到命名空間ns1中的成員,在使用該命名空間內的任何成員時都沒必要使用命名空間限定。在用using namespace聲明的做用域中,命名空間ns1的成員好像在全局域中聲明的同樣,所以不用加命名限定。
四、無名的命名空間
例:
namespace
{
void fun();
}
因爲沒有名字,因此其它文件沒法引用,它只能在本文件的做用域內有效,它的做用域使重無名命名空間聲明開始到本文件結束。在本文件使用無名命名空間成員時沒必要用命名空間限定。其實無名命名空間和static是一樣的道理,都是隻在本文件內有效,沒法被其它文件引用。
五、標準命名空間
C++庫的全部標識符都是在一個名爲std的命名空間中定義的,或者說標準頭文件(iostream)中的函數、類、對象和類模板是在命名空間std中定義的。因此在C++程序的一開始,就用using namespace對std進行全局聲明。