天天看點

C++ Primer 有感(函數)

1.函數應該在頭檔案中聲明,并在源檔案中定義。(定義函數的源檔案應包含聲明該函數的頭檔案)将提供函數聲明的頭檔案包含在定義該函數的源檔案中,可使編譯器能檢查該函數的定義和聲明是否一緻。

2.既可以在函數聲明也可以在函數定義中指定預設參數。但是,在一個檔案中,隻能為一個形參指定預設實參一次。下面的例子是錯誤的:

  //ff.h

int ff ( int i=0 );

  //ff.c

 #include "ff.h"

 int ff( int i= 0 ){ /* ......*/ }  //error

通常,應在函數聲明中指定預設實參,并将該聲明放在合适的頭檔案中。

如果在函數定義的形參表中提供預設實參,那麼隻有在包含該函數定義的源檔案中調用該函數時,預設實參才是有效的。

3.内聯函數應該在頭檔案中定義,這一點不同于其他函數。

  内聯函數能要在程式中定義不止一次,隻要内聯函數的定義在某個源檔案中隻出現一次,而且在所有源檔案中,其定義必須是完全相同的。把内聯函數的定義放在頭檔案中,可以確定在調用函數所使用的定義是相同的,并且保證在調用點該函數的定義對編譯器可見。

  在頭檔案中加入或修改内聯函數時,使用了該頭檔案的所有源檔案都必須重新編譯。

4.編譯器隐式的将在類内定義的成員函數當作内聯函數。

5.const對象,指向const對象的指針或引用隻能用于調用其const成員函數,如果嘗試用它們調用非const成員函數,則是錯誤的。

6.如果沒有為一個類顯式定義任何構造函數,編譯器将自動為這個類生成預設構造函數。

  合成的預設構造函數一般适用于僅包含類類型成員的類。而對于含有内置類型或複合類類型成員的類,則通常應該定義他們自己的預設構造函數初始化這些成員。

7.如果兩個函數聲明的傳回類型和形參表完全比對,則将第二個函數聲明視為第一個的重複聲明。如果兩個函數的形參表完全相同, 但傳回類型不同,則第二個聲明視錯誤的。

   在同一類中,對于函數名相同的const函數和非const函數能夠構成重載,同時它們被調用的時機為:如果定義的對象時常對象,則調用的是const成員函數,如果定義的對象非常對象,則調用的重載的非const成員函數。

  重載函數的條件:

(1)相同的作用域

(2)函數名相同

(3)函數的形參表不同

(4)與函數的傳回值無關

對于重載注意:

(1)形參與const形參的等價性僅适用于非引用形參;

(2)有const引用形參的函數與有非const引用形參的函數是不同;

(3)函數帶有指向const類型的指針形參與帶有指向相同類型的非const對象的指針形參的函數不相同。