函式的定義
函式由函式名以及一組運算元型別唯一的表示。
函式體是乙個作用域
函式體是乙個語句塊,定義了函式的具體操作,形成了乙個 新的作用域。可以在函式體內定義變數,這種變數是區域性變數,變數名字只在函式內可見。
函式返回型別
函式的返回型別可以是內建型別,類型別或者復合型別(例如引用或者指標),甚至是void型別(即可以沒有返回值)。但是不能返回另乙個函式或者內建型別的陣列。函式必須指定返回值型別。
形參列表
形參列表可以為空但是不能忽略。形參表是由一系列用逗號分隔的引數型別和引數名組成,每乙個引數的資料型別必須全部宣告。
c++中每次函式呼叫編譯時都會檢查實參型別。呼叫函式時,對於每乙個實參,其型別都必須與對應的形參型別相同,或者可以轉換成對應形參的型別。
引數傳遞
形參的初始化與變數的初始化一樣:如果形參為非引用型別,則複製實參的值;如果形參為引用型別,則它只是實參的別名。
非引用形參
指標形參
和其他非引用型別一樣,這裡只是賦值指標的值作為區域性變數。實參的值並不會受到函式操作的影響。
consr形參
呼叫函式時,如果該函式之用的是非引用的非const形參,則既可以給該函式傳遞const實參,也可以傳遞非const實參。
如果該函式之用的是非引用的const形參,則既可以給該函式傳遞const實參,也可以傳遞非const實參。和非const型別不同的是,函式中不能修改實參的區域性副本。
複製實參的侷限性
複製實參並不是所有情況都適合:
a)當需要在函式中修改實參的值時。
b)當需要以大型物件作為實參傳遞時(因為複製物件消耗比較大)。
c)所傳遞的引數型別無法複製時。
引用形參
如果期望函式修改實參的值就可以使用引用形參。
可以使用引用形參返回額外的資訊
因為函式的返回值只能由乙個,但是如果函式有不止乙個內容需要返回,則可以通過定義引用形參的方式儲存資訊。用傳遞進來的實參儲存資訊時候,函式呼叫結束,需要返回的資訊也儲存在引用實參中。
利用const引用避免複製
如果使用引用形參的唯一目的時避免複製(不適合複製實參情況)時,則應該將 形參定義為const引用。既可以避免複製,又可以利用const修飾符避免實參被修改。
應該將不需要修改的引用形參定義為const引用。普通的非const引用形參在使用時不夠靈活。這樣的形參即不能用const物件初始化,也不能用字面值或產生右值的表示式初始化實參。
傳遞指向指標的引用
有如下函式的定義:
//交換傳入的兩個指標的值
void
ptrswap
(int
*&v1,
int*
&v2)
其中形參 int *&v1要從右到左理解,首先v1是乙個引用,這個變數與指向int型物件的指標相關聯。
陣列形參
陣列是不可以被整體複製的,而且在使用陣列名字時,這個名字會自動轉化為指向第乙個元素的指標。由於這兩點特性,我們一般通過操縱指向陣列中的元素的指標來處理陣列。
陣列形參的定義
可以使用一下三種方式執行陣列形參:
void
print
(int*)
;void
print
(int
);void
print
(int[10
]);
這三種定義是等價的,形參型別都是int*。
形參的長度會引起誤解
當編譯器檢查陣列形參關聯的實參時,他只會檢查實參是不是指標、指標型別和陣列元素的型別是否匹配,而不會檢查陣列長度。
陣列實參
一般來說,陣列以普通的非引用型別傳遞。在傳遞陣列時,實參是指向陣列第乙個元素的指標,形參複製的是這個指標的值,而不是陣列元素本身。函式操作的時這個指標的副本,所以不是修改指標本身的值,但是可以用過這個指標修改指標所指向的陣列元素的值。
通過引用傳遞陣列
如果形參是陣列的引用,則編譯器不會將陣列實參轉化為指標,二十傳遞陣列的引用本身。在這種情況下,編譯器會檢查陣列實參的大小和形參的大小是否匹配。
void
printarray
(int
(&arr)[10
]);
這個函式就會嚴格地接受含有10個int型資料的陣列。
函式宣告
函式宣告由函式返回型別、函式名和形參列表。這三個元素被稱為函式原型。
預設實參
預設實參是通過給形參表中的形參提供明確的初始值來指定的。
如果給該函式中形參提供預設值,則定義在該形參前面的形參也要提供預設值。
string screen
(size_type height =24,
size_type width =80,
char background =
' ')
;
就上面這個函式的宣告,如果給background提供了實參,也必須給height和width提供實參。 每日複習筆記
未知數量輸入的解決辦法 利用whlie迴圈 讀入位置數量的輸入 include using namespace std int main cout sum is sum 注意 一般windows系統的檔案結束符是ctrl z unix系統中是 control d。標頭檔案的小細節 標準庫的標頭檔案用...
每日複習筆記4 28
感覺這個部分真的是重難點啊,用好的真好用,用不好是,哎,我是菜雞。有乙個順序容器和順序容器介面卡的概念,這裡先寫點關於順序容器的吧。常見的順序容器有vector list和deque三種。順序容器的定義 所有的容易都是類模板,通過模板可以編寫乙個類定義,而用於多個不同的資料型別。容器元素的初始化 表...
每日複習筆記5 3
關聯容器支援通過鍵來高效的查詢和讀取元素。有兩種基本的關聯容器型別 map和set。pair型別 表示式功能 pairp1 建立乙個空的pair物件,它的兩個元素分別是ti和t2型別的,採用值初始化。pairp1 v1,v2 建立乙個pair物件,它的兩個元素分別是ti和t2型別的,first成員初...