C++編程思想學習筆記——名字控制

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:18px;"></span></span><pre name="code" class="cpp"><span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;">概要:名字控制主要用於對名字的產生和名字的可見性進行控制,包括這些名字的存儲位置以及名字的連接。</span>

  1. 在C/C++中,Static都有兩種基本的含義
    1. 在固定的地址上進行存儲分配,也就是說對象是在一個特殊的靜態數據區上創建的,而不是每次函數調用時在堆棧上產生的。
    2. 對一個特定的編譯單位來說是局部的。這樣,Static控制名字的可見性,所以這個名字在這個單元之外是不可見的,同時也決定連接器將看到哪些名字。
    3. Static變量或對象只在函數第一次調用時初始化一次,以後它將在兩次函數調用之間保持它的值。
    4. 如果沒有爲一個內建類型的靜態變量提供一個初始值時,編譯器也會確保在程序開始時它被初始化爲零,零賦值只對內建類型有效,用戶自定義類型必須用構造函數來初始化。
    5. 在使用帶有靜態變量的函數時,應該考慮多線程的問題。
  2. 靜態對象的析構函數
    1. 靜態對象的析構函數在程序從main()中退出時,或者標準的C庫函數exit()被調用時才被調用。注:在析構函數內部使用exit()是很危險的,這樣導致了無窮的遞歸調用。
    2. 用標準的C庫函數abort()退出程序時,靜態對象的析構函數並不會被調用。
    3. 同普通對象的銷燬一樣,靜態對象的銷燬也是按與初始化時相反的順序進行的。
    4. 全局對象總是在main()執行之前被創建,在退出main()時銷燬。
    5. 如果一個包含局部靜態對象的函數從未被調用過,那麼這個對象的構造函數也就不會執行,自然也不會執行析構函數。只要包含局部靜態對象的函數在名義上被調用了,那麼它的構造函數就會被執行。
  3. 控制連接
    1. 一般情況下,在文件作用域內所有名字對程序中的所有翻譯單元來說都是可見的,這就是所謂的外連接(external linkage)。因爲在連接時這個名字對連接器來說是可見的,對單獨的翻譯單元來說它是外部的。全部變量和普通函數都有外部鏈接。
    2. 在文件作用域內,一個被明確聲明爲static的對象或函數的名字對翻譯單元來說是局部於該單元的,這些名字是內連接的。內連接的一個好處是這個名字可以放在一個頭文件中而不用擔心連接時發生衝突。
  4. 名字空間的作用就是將一個大的全局名字空間分割成多個可管理的小空間。空間名字彼此不能相同,但是控制之間內部變量則可以相同。形象地說,就像行政區命名一樣,幾乎沒有相同名字的省市,但是在不同的省市之間,可能有相同名字的村莊。
  5. 創建名字空間
    <span style="font-size:18px;font-weight: normal;">namespace xxx{
    
    };</span>
  6. namespace的特徵:
    1. namespace只能在全局範圍內定義,但是它們之間可以互相嵌套;
    2. 在namespace定義的結尾,右花括號的後面不必跟一個分號;
    3. 可按照類的語法定義一個namespace,定義的內容可在多個頭文件中延續,就好像重複定義這個namespace一樣。
    4. 一個namespace的名字可以用另一個名字來作它的別名,這樣就可以不必敲打那些開發商提供的冗長的名字了。
      <span style="font-weight: normal;">namespace xxx{
         ...
      }
      
      namespace mylib = xxx;</span>
    5. 不能像類那樣去創建一個名字空間的實例。
  7. 使用名字空間的方法:
    1. 作用域解析
      namespace xxx{
         int i;
         ...
      }
      
      xxx::i = 1;

    2. 使用指令
      using namespace xxx;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章