為什麼預設實參總是放在函式宣告中

2021-06-23 04:45:05 字數 1243 閱讀 6655

**:

對於函式的預設實參,我們一般都是放在函式的宣告中的,而在定義中並不指定預設實參:

在標頭檔案中宣告函式:

void func(int i = 0);

而在對應的原始檔中實現函式:

void func(int i){}//什麼也不做

如果我們將預設實參從宣告中刪除,而在定義中新增,或者是宣告和定義中都新增,不論值是否相同,都會報錯。

但是,c++並沒有規定必須是這樣,c++的規定是:乙個函式的預設實參既可以在定義中,也可在宣告中指定,但在乙個檔案(準確的說,是乙個作用域)中只能為乙個形參指定預設實參一次。

(那為什麼將預設實參從宣告中刪除,而在定義中新增會報錯呢?原因是:

宣告中並沒有指出這個函式有預設引數,見下)

所以,我們可以這樣寫:

[cpp]view plain

copy

intfunc1(

inti = -1)  

intmain()    

這裡就是在定義中指定的預設實參。

甚至我們可以這樣寫:

[cpp]view plain

copy

intmain()  

intfunc1(

inti = -1)  

在全域性作用域中,指定的預設值是-1,但是在main函式的作用域中,指定的預設值為1。

現在回到剛才提出的問題:

1.為什麼預設實參從宣告中刪除,而在定義中新增會報錯。因為當主函式(main.cpp)與標頭檔案(test.h)相結合時,通過標頭檔案的宣告,得知func函式需要乙個int型別的引數,(宣告中並沒有指出這個函式有預設引數),所以當編譯main.cpp時,會報錯:

d:\myprograms\c++\test\test\main.cpp(9): error c2660: 「func」: 函式不接受 0 個引數

2.為什麼在宣告和定義中都新增,也會報錯。原因是因為書上說的:但在乙個檔案(準確的說,是乙個作用域)中只能為乙個形參指定預設實參一次。當編譯的時候,標頭檔案回和原始檔結合,這時,就會出現多次指定預設形參的情況,編譯器報錯:

d:\myprograms\c++\test\test\test.cpp(3): error c2572: 「func」: 重定義預設引數 : 引數 1

相信看了以上的分析,我們就不難理解為什麼預設實參一般都是放在函式的宣告中的,而在定義中並不指定預設實參了。

為什麼預設實參總是放在函式宣告中

對於函式的預設實參,我們一般都是放在函式的宣告中的,而在定義中並不指定預設實參 在標頭檔案中宣告函式 void func int i 0 而在對應的原始檔中實現函式 void func int i 什麼也不做 如果我們將預設實參從宣告中刪除,而在定義中新增,或者是宣告和定義中都新增,不論值是否相同,...

標頭檔案中函式宣告 預設實參與區域性物件

正如變數必須先宣告後使用一樣,函式也必須在被呼叫之前先宣告。與變數的定義類似,函式的宣告也可以和函式的定義分離 乙個函式只能定義一次,但是可宣告多次。函式宣告由函式返回型別 函式名和形參列表組成。形參列表必須包括形參型別,但是不必對形參命名。這三個元素被稱為函式原型,函式原型描述了函式的介面。函式宣...

為什麼把成員函式宣告為虛函式

1.首先看成員函式所在的類是否會作為基類。然後看成員函式在類的繼承後有無可能被更改功能,如果希望更改其功能的,一般應該將它宣告為虛函式。2.如果成員函式在類被繼承後功能不需修改,或派生類用不到該函式,則不要把它宣告為虛函式。不要僅僅考慮到要作為基類而把類中的所有成員函式都宣告為虛函式。3 應考慮對成...