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

2022-05-28 07:51:12 字數 3155 閱讀 1679

正如變數必須先宣告後使用一樣,函式也必須在被呼叫之前先宣告。與變數的定義類似,函式的宣告也可以和函式的定義分離;乙個函式只能定義一次,但是可宣告多次。

函式宣告由函式返回型別、函式名和形參列表組成。形參列表必須包括形參型別,但是不必對形參命名。這三個元素被稱為函式原型, 函式原型描述了函式的介面。

函式宣告中的形參名會被忽略,如果在宣告中給出了形參的名字,它應該用作輔助文件:

void print(int *array, int size);

函式應當在標頭檔案中宣告,並在原始檔中定義。

把函式宣告放在標頭檔案中,這樣可以確保對於指定函式其所有宣告保持一致。如果函式介面發生變化,則只要修改其唯一的宣告即可。

定義函式的原始檔應包含宣告該函式的標頭檔案。

將提供函式宣告標頭檔案包含在定義該函式的原始檔中, 可使編譯器能檢查該函式的定義和宣告時是否一致。特別地,如果函式定義和函式宣告的形參列表一致,但返回型別不一致,編譯器會發出警告或出錯資訊來指出這種差異。

預設實參是一種雖然並不普遍、但在多數情況下仍然適用的實參值。呼叫函式時,可以省略有預設值的實參。編譯器會為我們省略的實參提供預設值。

預設實參是通過給形參表中的形參提供明確的初始值來指定的。可為乙個或多個形參定義預設值。但是,如果有乙個形參具有預設實參,那麼,它後面所有的形參都必須有預設實參。

string screeninit(string::size_type height = 24

,string::size_type width = 80

,char background = '

' );

呼叫包含預設實參的函式時,可以為該形參提供實參,也可以不提供。如果提供了實參,則它將覆蓋預設的實參值;否則,函式將使用預設實參值。下面的函式screeninit 的呼叫都是正確的:

string

screen;

screen = screeninit(); //

equivalent to screeninit (24,80,'')

screen = screeninit(66); //

equivalent to screeninit (66,80,'')

screen = screeninit(66, 256); //

screeninit(66,256,' ')

screen = screeninit(66, 256, '

#');

函式呼叫的實參按位置解析,預設實參只能用來替換函式呼叫缺少的尾部實參。

例如,如果要給 background 提供實參,那麼也必須給 height 和 width 提供實參:

screen = screeninit(, , '

?'); //

error, can omit only trailing arguments

screen = screeninit( '

?'); //

calls screeninit('?',80,' ')

設計帶有預設實參的函式,其中部分工作就是排列形參,使最少使用預設實參的形參排在最前,最可能使用預設實參的形參排在最後。

預設實參可以是任何適當型別的表示式:

string

::size_type screenheight();

string::size_type screenwidth(string

::size_type);

char screendefault(char = '');

string

screeninit(

string::size_type height =screenheight(),

string::size_type width =screenwidth(screenheight()),

char background = screendefault());

如果預設實參是乙個表示式,而且預設值用作實參,則在呼叫函式時求解該表示式。

既可以在函式宣告也可以在函式定義中指定預設實參。但是,在乙個檔案中,只能為乙個形參指定預設實參一次。下面的例子是錯誤的:

//

ff.h

int ff(int = 0

);//

ff.cc

#include "

ff.h

"int ff(int i = 0) //

error

通常,應在函式宣告中指定預設實參,並將該宣告放在合適的標頭檔案中。

如果在函式定義的形參表中提供預設實參, 那麼只有在包含該函式定義的原始檔中呼叫該函式時,預設實參才是有效的。

在 c++ 語言中,每個名字都有作用域,而每個物件都有生命期。

名字的作用域指的是知道該名字的程式文字區。物件的生命期則是在程式執行過程中物件存在的時間。

在函式中定義的形參和變數的名字只位於函式的作用域中:這些名字只在函式體中可見。通常,變數名從宣告或定義的地方開始到包圍它的作用域結束處都是可用的。

預設情況下,區域性變數的生命期侷限於所在函式的每次執行期間。只有當定義它的函式被呼叫時才存在的物件稱為自動物件。自動物件在每次呼叫函式時建立和撤銷。

區域性變數所對應的自動物件在函式控制經過變數定義語句時建立。如果在定義時提供了初始化式,那麼每次建立物件時,物件都會被賦予指定的初值。對於未初始化的內建型別區域性變數,其初值不確定。當函式呼叫結束時,自動物件就會撤銷。

形參也是自動物件。形參所占用的儲存空間在呼叫函式時建立,而在函式結束時撤銷。

自動物件,包括形參,都在定義它們的塊語句結束時撤銷。形參在函式塊中定義, 因此當函式的執行結束時撤銷。 當函式結束時, 會釋放它的區域性儲存空間。在函式結束後,自動物件和形參的值都不能再訪問了。

乙個變數如果位於函式的作用域內,但生命期跨越了這個函式的多次呼叫,這種變數往往很有用。則應該將這樣的物件定義為 static(靜態的)。

static 區域性物件確保不遲於在程式執行流程第一次經過該物件的定義語句時進行初始化。這種物件一旦被建立,在程式結束前都不會撤銷。當定義靜態區域性物件的函式結束時,靜態區域性物件不會撤銷。在該函式被多次呼叫的過程中,靜態區域性物件會持續存在並保持它的值。

size_t count_calls()

intmain()

這個程式會依次輸出 1 到 10(包含 10)的整數。 

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

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

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

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

函式中的形參與實參

總結了兩個回答關於指標和單量傳入是值傳遞,函式執行後不會改變原來變數值 陣列是取了陣列的首位址相當於傳入的是實參,函式執行後會發生改變寫的非常非常清楚 在普通變數或下標變數作函式引數時,形參變數和實參變數是由編譯系統分配的兩個不同的記憶體單元。在函式呼叫時發生的值傳送是把實參變數的值賦予形參變數。在...