C++ namespace案例詳解
在C++語言編寫的程序中,變量和函數等的作用范圍是有一定限制的。比如,在函數體中定義的一個臨時變量就不可以在函數體外使用。為瞭解決變量和函數等的作用范圍,在C++語言中引入瞭名空間的概念,並增加瞭關鍵字namespace和using
在一個名空間中可以定義一組變量和函數,這些變量和函數的作用范圍一致,可以將這些變量和函數稱為這個名空間的成員。
通過名空間,可以在同一個文件中使用相同的變量名或函數名,隻要它們屬於不同的名空間。另外,名空間可以使得代碼操作具有相同名字但屬於不同庫的變量。而且,名空間也可以提高C語言與C++語言的兼容性。
下面通過例程說明關鍵字namespace的用法。
#include <conio.h> #include <iostream.h> namespace car // 名空間的定義 { int model; int length; int width; } namespace plane { int model; namespace size // 名空間的嵌套 { int length; int width; } } namespace car // 添加名空間的成員 { char * name; } namespace c=car; // 定義名空間的別名 int Time; // 外部變量屬於全局名空間 void main() { car::length=3; // 下面一句錯誤,故屏蔽掉 // width=2; // 對於非全局變量和當前有效臨時變量應該指定名空間 plane::size::length=70; cout<<"the length of plane is "<<plane::size::length<<"m."<<endl; cout<<"the length of car is "<<car::length<<"m."<<endl; // 使用名空間的別名 cout<<"the length of c is "<<c::length<<"m."<<endl; int Time=1996; // 臨時變量,應區別於全局變量 ::Time=1997; cout<<"Temp Time is "<<Time<<endl; cout<<"Outer Time is "<<::Time<<endl; // 使用關鍵字using using namespace plane; model=202; size::length=93; cout<<model<<endl; cout<<size::length<<endl; getch(); }
運行結果:
the length of plane is 70m.
the length of car is 3m.
the length of c is 3m.
Temp Time is 1996
Outer Time is 1997
說明:
• 從上面可以看出,名空間定義瞭一組變量和函數,它們具有相同的作用范圍。對於不同的
名空間,可以定義相同的變量名或函數名,在使用的時候,隻要在變量名或函數名前區分
開不同的名空間就可以瞭。
• 名空間可以被嵌套定義,使用時要逐級對成員用名空間限定符: :來引用。
• 系統默認有一個全局名空間,它包含瞭所有的外部變量。這個名空間沒有名字,引用這個
名空間裡的變量時要使用名空間限定符: :,前面沒有名字。在不使用名空間的情況下,我
們知道,不可以在不同文件中定義相同名字的外部變量,這是因為它們屬於同一個全局名
空間,名字不可以重復。
• 可以給名空間取一個別名。一般別名是一個比較短的名字,來簡化編程。
• 在原有定義好的名空間的基礎上,隨時可以往裡增加成員。
<<using>>
在前面的例程中可以看到,為瞭使用時的方便,又引入瞭關鍵字using。利用using聲明可以在引用名空間成員時不必使用名空間限定符::。此外,關鍵字namespace和using的使用,對函數重載有一定的影響。
下面通過例程進行具體說明。
#include <conio.h> #include <iostream.h> namespace car // 名空間的定義 { void ShowLength(double len) // 參數類型為d o u b l e { cout<<"in car namespace: "<<len<<endl; } } namespace plane // 名空間的定義 { void ShowLength(int len) // 參數類型為i n t { cout<<"in plane namespace: "<<len<<endl; } } void main() { using namespace car; ShowLength(3); ShowLength(3.8); using namespace plane; ShowLength(93); ShowLength(93.75); getch(); }
運行結果:
in car namespace: 3
in car namespace: 3.8
in plane namespace: 93
in car namespace: 93.75
說明:
如果沒有名空間的幹擾,函數重載時選擇規則將是非常簡單。隻要實參是double類型,則調用的是前面的函數;如果實參是int類型,則調用後面的函數。但是由於名空間的參與,就出現瞭上面的運行結果。所以在編程的時候一定要註意名空間對函數重載的影響。
應註意:調用函數時,如果實參和形參的數據類型實在沒有辦法完全匹配,可能會對實參進行適當的數據類型轉換。比如,將char類型轉換為int類型,或進一步將int類型轉換為double類型。這種是將數據類型從簡單往復雜轉換,一般不會丟失信息。另外一種轉換是反過來,將double類型轉換為int類型,或進一步將int類型轉換為char類型。這種是將數據類型從復雜往簡單轉換,可能會丟失部分信息。在調用函數的時候,不同的情況下,C++對上述兩種轉換的優先級是不同的。當引入瞭名空間後,則參與瞭上述優先級順序的分配。
using namespace std之後,就省去瞭std::,可以直接引用std空間裡面的函數和變量。
到此這篇關於C++ namespace案例詳解的文章就介紹到這瞭,更多相關C++ namespace講解內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!