C++ 笔记(03)— 命名空间(概念、定义、调用、using name 指令、嵌套命名空间)
1. 命名空間概念
在 C++ 應(yīng)用程序中, 您可能會(huì)寫一個(gè)名為 func() 的函數(shù),在另一個(gè)可用的庫(kù)中也存在一個(gè)相同的函數(shù) func() 。這樣,編譯器就無(wú)法判斷您所使用的是哪一個(gè) func() 函數(shù)。
因此,引入了命名空間概念,專門用于解決上面的問(wèn)題,它可作為附加信息來(lái)區(qū)分不同庫(kù)中相同名稱的函數(shù)、類、變量等。使用了命名空間即定義了上下文。本質(zhì)上,命名空間就是定義了一個(gè)范圍。
命名空間是給代碼指定的名稱,有助于降低命名沖突的風(fēng)險(xiǎn)。
2. 定義命名空間
命名空間的定義使用關(guān)鍵字 namespace ,后跟命名空間的名稱,如下所示:
namespace namespace_name {// 代碼聲明
}
3. 調(diào)用命名空間
為了調(diào)用帶有命名空間的函數(shù)或變量,需要在前面加上命名空間的名稱,如下所示:
name::code; // code 可以是變量或函數(shù)
4. using 指令
可以使用 using namespace 指令,這樣在使用命名空間時(shí)就可以不用在前面加上命名空間的名稱。這個(gè)指令會(huì)告訴編譯器,后續(xù)的代碼將使用指定的命名空間中的名稱。
5. 使用示例
5.1 自定義命名空間
#include <iostream>
using namespace std;// 第一個(gè)命名空間
namespace first_sapce
{void func(){cout << "first namespace" << endl;}
}// 第二個(gè)命名空間
namespace second_space
{void func(){cout << "second namespace" << endl;}
}int main()
{ // 調(diào)用第一個(gè)命名空間中的函數(shù)first_sapce::func();return 0;
}
為了避免頻繁輸入命名空間名稱,也可以使用 using namespace 指令,如下所示:
using namespace first_sapce;
int main()
{ // 調(diào)用第一個(gè)命名空間中的函數(shù)func();return 0;
}
或者僅使用用到的函數(shù), 調(diào)用第一個(gè)命名空間中的函數(shù):
using first_sapce::func;int main()
{ func();return 0;
}
5.2 標(biāo)準(zhǔn)命名空間
- 未使用
using namespace指令
#include <iostream>int main()
{std::cout << "hello,world" << std::endl;return 0;
}
- 使用
using namespace指令包含全部元素
通過(guò)告訴編譯器您要使用名稱空間 std ,在第 7 行使用 cout 和 endl 時(shí),就無(wú)需顯式地指定名稱空間了。
#include <iostream>using namespace std;int main()
{cout << "hello,world" << endl;return 0;
}
- 使用
using namespace指令僅包含使用的元素
using 指令也可以用來(lái)指定命名空間中的特定項(xiàng)目。例如,如果您只打算使用 std 命名空間中的 cout 部分,您可以使用如下的語(yǔ)句:
using std::cout; // 這種語(yǔ)法結(jié)構(gòu)稱為 using 聲明
完整示例函數(shù)
#include <iostream>using std::cout;
using std::endl;int main()
{cout << "hello,world" << endl;return 0;
}
兩者的差別在于:
- 前者讓您能夠在不顯式指定名稱空間限定符
std::的情況下使用名稱空間std中的所有元素(cout、cin等); - 后者讓您能夠在不顯式指定名稱空間限定符
std::的情況下僅使用std::cout和std::endl;
using 指令引入的名稱遵循正常的范圍規(guī)則。名稱從使用 using 指令開(kāi)始是可見(jiàn)的,直到該范圍結(jié)束。此時(shí),在范圍以外定義的同名實(shí)體是隱藏的。
一個(gè)一般性的原則是: 除非是 std 這種在某個(gè)應(yīng)用領(lǐng)域中大家已經(jīng)非常熟悉的名字空
間 ,否則最好不要使用 using 指令 。 過(guò)度使用 using 指令帶來(lái)的問(wèn)題是, 你已經(jīng)記不清每個(gè)名字來(lái)自哪里,結(jié)果就是你又陷入名字沖突之中 。
顯式使用全限定名或者使用 using 聲明就不存在這個(gè)問(wèn)題 。 因此 , 將一個(gè) using 指令放在頭文件中是一個(gè)非常壞的習(xí)慣,因?yàn)橛脩艟蜔o(wú)法避免上述問(wèn)題 。
6. 不連續(xù)的命名空間
命名空間可以定義在幾個(gè)不同的部分中,因此命名空間是由幾個(gè)單獨(dú)定義的部分組成的。一個(gè)命名空間的各個(gè)組成部分可以分散在多個(gè)文件中。
所以,如果命名空間中的某個(gè)組成部分需要請(qǐng)求定義在另一個(gè)文件中的名稱,則仍然需要聲明該名稱。下面的命名空間定義可以是定義一個(gè)新的命名空間,也可以是為已有的命名空間增加新的元素:
namespace namespace_name {// 代碼聲明
}
7. 嵌套命名空間
命名空間可以嵌套,您可以在一個(gè)命名空間中定義另一個(gè)命名空間,如下所示:
namespace namespace_name1 {// 代碼聲明namespace namespace_name2 {// 代碼聲明}
}
可以通過(guò)使用 :: 運(yùn)算符來(lái)訪問(wèn)嵌套的命名空間中的成員:
// 訪問(wèn) namespace_name2 中的成員
using namespace namespace_name1::namespace_name2;// 訪問(wèn) namespace:name1 中的成員
using namespace namespace_name1;
在上面的語(yǔ)句中,如果使用的是 namespace_name1 ,那么在該范圍內(nèi) namespace_name2 中的元素是不可以直接使用的,除非使用命名空間說(shuō)明 second_space::second(),如下所示:
#include <iostream>
using namespace std;// 第一個(gè)命名空間
namespace first_space
{void func(){cout << "first_space" << endl;}// 第二個(gè)命名空間namespace second_space{void func(){cout << "second_space" << endl;}}
}
using namespace first_space::second_space;int main ()
{// 調(diào)用第二個(gè)命名空間中的函數(shù)func();return 0;
}
輸出結(jié)果:
second_space
#include <iostream>
using namespace std;// 第一個(gè)命名空間
namespace first_space
{void func(){cout << "first_space" << endl;}// 第二個(gè)命名空間namespace second_space{void second(){cout << "second_space" << endl;}}
}
using namespace first_space;int main ()
{// 調(diào)用第一個(gè)命名空間中的函數(shù)func();// second(); ‘second’ was not declared in this scopesecond_space::second();return 0;
}
輸出結(jié)果:
first_space
second_space
總結(jié)
以上是生活随笔為你收集整理的C++ 笔记(03)— 命名空间(概念、定义、调用、using name 指令、嵌套命名空间)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 喜大普奔下一句是什么啊?
- 下一篇: C++ 笔记(04)— 数据类型(各类型