C 命名空間,5分鐘詳解

2021-10-19 13:51:02 字數 2007 閱讀 5680

在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宣告

using宣告可使得指定的識別符號可用。

namespace a

void

funcb()

}void

test()

using宣告碰到函式過載

如果命名空間包含一組用相同名字過載的函式,using宣告就宣告了這個過載函式的所有集合。

namespace a

void

func

(int x)

intfunc

(int x,

int y)

}void

test()

using編譯指令

using編譯指令使整個命名空間識別符號可用.

注意:使用using宣告或using編譯指令會增加命名衝突的可能性。也就是說,如果有命名空間,並在**中使用作用域解析運算子,則不會出現二義性。

namespace a

void

funcb()

}void

test01()

namespace b

void

funcb()

}void

test02()

#命名空間使用

需要記住的關鍵問題是當引入乙個全域性的using編譯指令時,就為該檔案開啟了該命名空間,它不會影響任何其他的檔案,所以可以在每乙個實現檔案中調整對命名空間的控制。

比如,如果發現某乙個實現檔案中有太多的using指令而產生的命名衝突,就要對該檔案做個簡單的改變,通過明確的限定或者using宣告來消除名字衝突,這樣不需要修改其他的實現檔案。

python命名空間(五分鐘讀懂)

1.命名空間指的是變數儲存的位置,每乙個變數都需要儲存到指定的命名空間當中 2.每乙個作用域都會有乙個它對應的命名空間 3.全域性命名空間,用來儲存全域性變數。函式命名空間用來儲存函式中的變數 4.命名空間實際上就是乙個字典,是乙個專門用來儲存變數的字典 1.在全域性作用域中呼叫locals 則獲取...

C 類模板5分鐘入門

參考自 c 除了支援函式模板,還支援類模板 class template 函式模板中定義的型別引數可以用在函式宣告和函式定義中,類模板中定義的型別引數可以用在類宣告和類實現中。類模板的目的同樣是將資料的型別引數化。宣告類模板的語法為 templateclass 類名 類模板和函式模板都是以 temp...

5分鐘弄懂Docker

儘管之前久聞docker的大名了,但是天資愚鈍,對其到底是個啥東西一直摸不清,最近花了一段時間整理了一下,算是整理出一點頭緒來。官網的介紹是這樣的 那麼應用容器長什麼樣子呢,乙個做好的應用容器長得就好像乙個裝好了一組特定應用的虛擬機器一樣。比如我現在想用mysql那我就找個裝好mysql的容器,執行...