關於函式預設引數的說法

2021-05-22 14:32:15 字數 1506 閱讀 3144

在網上找到2種說法,第一種預設引數在申明中賦值,第二種預設引數在定義(實現)中賦值。

其實不知道哪種說法正確,但我所經歷的情況是二種都可以,以後有時間了再去仔細研究一下,先記下來

六、函式引數的預設值 (本講重點概念)

c++允許實參個數與形參個數不同。辦法是在形參表列中對乙個或幾個形參指定預設值(或稱預設值)。例如某一函式的首部可用如下形式:

void fun(int a, int b, int c=100)

在呼叫此函式時可寫成fun(2,4,6),還可寫成fun(2,4)。

請注意:賦予預設值的引數必須放在形參表列中的最右端。例如:

void f1(float a, int b, int c=0, char d=′a′)    (正確)

void f2(float a, int c=0, char d=′a′, int b)    (不正確)

例6. 使用函式引數預設值的示例。(參考教材例18-7)

#include

//以下是對函式fun()的定義,在函式定義部分設定了全部引數的預設值

void fun(int a=1,int b=2,int c=3)

cout<<"a="void main()

fun();             //三個引數全部使用預設值

fun(4);           //後兩個引數使用預設值

fun(4,5);         //第三個引數使用預設值

fun(4,5,6);       //不使用預設值

程式執行結果如下:

a=1,b=2,c=3

a=4,b=2,c=3

a=4,b=5,c=3

a=4,b=5,c=6

說明:每次呼叫時系統會根據實參個數確定是否採用形參預設值以及採用其中的幾個預設值。

注意:不要同時使用過載函式和預設引數的函式。

另外一種說法:

引數預設值只能出現在函式的宣告中,而不能出現在定義體中。

例如:

void foo(int x=0, int y=0);  // 正確,預設值出現在函式的宣告中

void foo(int x=0, int y=0)    // 錯誤,預設值出現在函式的定義體中

為什麼會這樣?我想是有兩個原因:一是函式的實現(定義)本來就與引數是否有預設值無關,所以沒有必要讓預設值出現在函式的定義體中。二是引數的預設值可能會改動,顯然修改函式的宣告比修改函式的定義要方便。

如果函式有多個引數,引數只能從後向前挨個兒預設,否則將導致函式呼叫語句怪模怪樣。

正確的示例如下:

void foo(int x, int y=0, int z=0);

錯誤的示例如下:

void foo(int x=0, int y, int z=0);

可能產生的二義性:

void output( int x);

void output( int x, float y=0.0);

//output(3);//error,產生二義性

C (帶有預設引數的函式引數)預設函式引數

預設引數?在c 中,允許實參的個數與形參的個數不同。在宣告函式原型時,為乙個或者多個形參指定預設值,以後呼叫這個函式時,若省略某乙個實參,c 則自動的以預設值作為相應引數的值。實列說明 includeusing namespace std int add int x 4,int y 7 int ma...

C 中關於預設建構函式和預設引數

include using namespace std class time time int s,int h 10,int m 52 time int h,int m,int s hour h minute m sec s 過載建構函式,執行時會根據形參的不同,自動匹配呼叫 類的初始化資料成員的另...

函式的預設引數

c 中只能定義一次預設值,即原型說明時定義了預設值,後面的函式定義不能有預設值,且預設引數都必須是從右到左定義,呼叫時實參對形參的初始化必須是從左向右的 比如 函式宣告f int i 5 定義了預設值。後面對f的函式定義時就不需要提供預設值了 f int i 即函式定義不能寫成 f int i 5 ...