建立名字是程式設計過程中一項最基本的活動,當乙個專案很大時,它會不可避免地包含大量名字。c++允許我們對名字的產生和名字的可見性進行控制。
我們之前在學習c語言可以通過static關鍵字來使得名字只得在本編譯單元內可見,在c++中我們將通過一種通過命名空間來控制對名字的訪問。
在c++中,名稱(name)可以是符號常量、變數、函式、結構、列舉、類和物件等等。工程越大,名稱互相衝突性的可能性越大。另外使用多個廠商的類庫時,也可能導致名稱衝突。為了避免,在大規模程式的設計中,以及在程式設計師使用各種各樣的c++庫時,這些識別符號的命名發生衝突,標準c++引入關鍵字namespace(命名空間/名字空間/命名空間),可以更好地控制識別符號的作用域。
建立乙個命名空間:
namespace a
namespace b
void
test()
命名空間只能全域性範圍內定義(以下錯誤寫法):
void
test()
namespace b
cout <<
"a::a : "
<< a::a << endl;
cout <<
"b::a : "
<< b::a << endl;
}
命名空間可巢狀命名空間:
namespace a
}void
test()
命名空間是開放的,即可以隨時把新的成員加入已有的命名空間中:
namespace a
namespace a
}void
test()
宣告和實現可分離:
#pragma once
namespace myspace
void myspace::
func1()
void myspace::
func2
(int param)
無名命名空間,意味著命名空間中的識別符號只能在本檔案內訪問,相當於給這個識別符號加上了static,使得其可以作為內部連線:
namespace
}void
test()
命名空間別名:
namespace verylongname
}void
test()
using宣告可使得指定的識別符號可用。
namespace a
void
funcb()
}void
test()
using宣告碰到函式過載:
namespace a
void
func
(int x)
intfunc
(int x,
int y)
}void
test()
如果命名空間包含一組用相同名字過載的函式,using宣告就宣告了這個過載函式的所有集合。
using編譯指令使整個命名空間識別符號可用。
namespace a
void
funcb()
}void
test01()
namespace b
void
funcb()
}void
test02()
注意:使用using宣告或using編譯指令會增加命名衝突的可能性。也就是說,如果有命名空間,並在**中使用作用域解析運算子,則不會出現二義性。
我們剛講的一些東西一開始會覺得難一些,這些東西以後還是挺常用,只要理解了它們的工作機理,使用它們非常簡單。
需要記住的關鍵問題是當引入乙個全域性的using編譯指令時,就為該檔案開啟了該命名空間,它不會影響任何其他的檔案,所以可以在每乙個實現檔案中調整對命名空間的控制。比如,如果發現某乙個實現檔案中有太多的using指令而產生的命名衝突,就要對該檔案做個簡單的改變,通過明確的限定或者using宣告來消除名字衝突,這樣不需要修改其他的實現檔案。
06 C 函式高階
01函式預設引數 02函式佔位引數 03函式過載 函式的構成包括五部分 int func int a 返回值型別,函式名,引數列表,函式體,返回語句 void型別可以省略 同名函式,引數列表不同,會發生過載 例如 1.intfunc int a 2.int func int a,int b 3.in...
06 C語言變數
變數的本質 變數的本質其實是程式可操作的儲存區的名稱。c 中每個變數都有特定的型別,型別決定了變數儲存的大小的範圍,在範圍內的值都可以儲存在記憶體中,運算子可應用於變數上。變數的名稱可以由字母 數字和下劃線字元組成。它必須以字母或下劃線開頭。大寫字母和小寫字母是不同的,因為 c 是大小寫敏感的。以下...
06 C 筆記 常量
1.進製 字首 0x 或 0x 表示十六進製制,0 表示八進位制,沒有字首則表示十進位制。字尾 可以是 u 或 l 的組合,其中,u 和 l 分別表示 unsigned 和 long。字尾可以是大寫或者小寫。2.科學記數法 e3.字串 轉義字元同c 的用法 string a hello,world ...