06 C 名字控制

2021-09-28 05:52:31 字數 2173 閱讀 4419

建立名字是程式設計過程中一項最基本的活動,當乙個專案很大時,它會不可避免地包含大量名字。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 ...