1. 程式人生 > >c++程式設計師面試寶典

c++程式設計師面試寶典

靜態儲存區 static靜態變數 全域性變數
棧 區域性變數
堆 動態分配的
棧堆:迴圈的迭代用中 資料量大 則溢位
239 static作用:靜態變數的生存週期和作用域http://blog.csdn.net/qibanxuehua/article/details/52702606
http://blog.csdn.net/liuqiaoyu080512/article/details/8455707
生存週期: 變數從定義到銷燬的時間範圍。
存放在全域性資料區的變數的生存週期存在於整個程式執行期間,而存放在棧中的資料則隨著函式等的作用域結束導致出棧而銷燬,除了靜態變數之外的區域性變數都存放於棧中。
作用域:

變數的可見程式碼域(塊作用域,函式作用域,類作用域,程式全域性作用域)//本檔案、整個源程式所有原始檔

static變數是指靜態的變數,不管是在全域性還是區域性宣告的static變數都存放於程式的全域性變數區域,所以它的生命週期是從程式開始到程式結束。但是static變數的作用域並不等同於它的生存週期,它的作用域決定於它被定義的位置。可以認為static變數的作用域<=生存週期。
在宣告全域性的static變數時,static沒有改變它的生存週期,也即儲存位置(因為全域性變數本來就儲存在全域性資料域),而是將變數的作用域限制在當前檔案中。

  • static全域性變數與普通的全域性變數有什麼區別 ?
     全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。
      全域性變數本身就是靜態儲存方式
    , 靜態全域性變數當然也是靜態儲存方式。 這兩者在儲存方式上並無不同
      這兩者的區別在於非靜態全域性變數的作用域是整個源程式, 當一個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於一個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其它原始檔中引起錯誤。
    static全域性變數只初使化一次,防止在其他檔案單元中被引用;  
  • static區域性變數和普通區域性變數有什麼區別 ?
      把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期
    。把全域性變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。
      static區域性變數只被初始化一次,下一次依據上一次結果值;  
  • static函式與普通函式有什麼區別?
       static函式與普通函式作用域不同,僅在本檔案。只在當前原始檔中使用的函式應該說明為內部函式(static修飾的函式),內部函式應該在當前原始檔中說明和定義。對於可在當前原始檔以外使用的函式,應該在一個頭檔案中說明,要使用這些函式的原始檔要包含這個標頭檔案.
    static函式在記憶體中只有一份,普通函式在每個被呼叫中維持一份拷貝
  • 252 static 關鍵字作用5:函式體內static變數 模組內static全域性變數 模組內static函式 類中static成員變數 類中static成員函式
  • const 關鍵字作用5:變數不變 指標 函式宣告修飾形參 類成員函式指定為const 類成員函式返回值指定為const

278多繼承
this 指標 http://blog.csdn.net/ipmux/article/details/25605147
c++不推薦使用多繼承,多繼承的二義性問題(多重繼承可以反映現實生活中的情況,能夠有效地處理一些較複雜的問題,使編寫程式具有靈活性,但是多重繼承也引起了一些值得注意的問題,它增加了程式的複雜度,使 程式的編寫和維護變得相對困難,容易出錯。其中最常見的問題就是繼承的成員同名而產生的二義性(ambiguous)問題)http://c.biancheng.net/cpp/biancheng/view/2210.html
解決辦法:

解決多繼承二義性:虛擬繼(間接性、共享性)承http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/05/2537451.html
時間:在通過繼承類物件訪問虛基類物件中的成員(包括資料成員和函式成員)時,都必須通過某種間接引用來完成,這樣會增加引用定址時間(就和虛擬函式一樣),其實就是調整this指標以指向虛基類物件,只不過這個調整是執行時間接完成的。

空間:由於共享所以不必要在物件記憶體中儲存多份虛基類子物件的拷貝,這樣較之多繼承節省空間。虛擬繼承與普通繼承不同的是,虛擬繼承可以防止出現diamond繼承時,一個派生類中同時出現了兩個基類的子物件。也就是說,為了保證這一點,在虛擬繼承情況下,基類子物件的佈局是不同於普通繼承的。因此,它需要多出一個指向基類子物件的指標。

每個存在虛擬函式的類都要有一個4位元組的指標指向自己的虛擬函式表虛繼承 有這樣的一個指標vptr_b_a,這個指標叫虛類指標,也是四個位元組;

  • 巨集 加括號是為了處理表達式引數(即巨集的引數可能是個演算法表示式)時不出錯,因為巨集替換就是文字替換