返回型別(return type)、函數名字、由0或多個形參(parameter)組成的列表以及函數體(function body)
執行函數
函數的呼叫
函數的返回型別不能是陣列或者函數,但可以是指向陣列或函數的指針
形參和函數內部定義的變數統稱爲區域性變數(local variable),僅在函數的作用域內可見,同時區域性變數還會隱藏(hide)在外層作用域中同名的其他所有宣告中
自動物件(automatic object)
只存在於塊執行期間的物件 例如形參
local static object區域性靜態物件
在程式的執行路徑第一次經過物件定義語句時初始化,直到程式終止才被銷燬
static物件再次遇見初始化語句會忽略初始化語句,不會有重複定義錯誤
函數宣告(declaration)==函數原型(prototype)
separate compilation
Using .cpp files to generate .o files. And then link the .o files
如果形參是參照型別,將系結到對應的實參上;否則,將實參的值拷貝後賦給形參 (都是對形參初始化,初始化形式不一樣)
當形參是參照型別時,對應參數被參照傳遞(passed by reference) 或函數被傳參照呼叫(called by reference)
當實參的值被拷貝給形參時,形參和實參是兩個互相獨立的物件。 稱爲實參被值傳遞(passed by value)或者函數被傳值呼叫(called by value)
如果函數無需改變參照形參的值,最好將其宣告爲常數參照
C風格字串末尾新增空字元是爲了方便處理字串
void print(const int*)
void print(const int[])
void print(const int[10])
這三個函數等價
管理陣列實參
指針陣列
[10][] decltype(m[i])==int *陣列指針
[][10] 行指針
可變參數初始化列表
儲存列表
/* initializer_list形參(模板)
數量不清楚,型別相同 */
initializer_list<T>lst; //預設初始化:T型別元素空列表
initializer_list<T>lst{a,b,c...}; /*列表元素是const*/
lst2(lst)||lst2=lst /*拷貝後,原始列表和副本共用元素*/
lst.size()
lst.begin()
lst.end()
省略符形參 便於C++程式存取某些特殊的C程式碼而設定 使用varargs的C標準庫功能
形式
return 語句終止當前執行的函數並將控制權返回到呼叫該函數的地方
兩種形式
void函數的最後一句後面會隱式地執行return
可以在void函數中間利用return語句可以直接退出函數(類似於break於回圈)
void函數如果使用return的第二種形式,expression 必須是另一個返回void的函數
編譯器儘量確保具有返回值的函數只能通過一條有效的return語句退出
列表初始化返回:返回一個初始化列表
return {"parameter","list"};
Type(*function(parameter_list))[dimension]
int (*func(int i))[10];
任何函數的定義都能使用尾置返回型別,但這種形式對於返回型別比較複雜的函數最有效(陣列的指針或陣列的參照)
尾置返回型別跟在形參列表後面並以一個->符號開頭
(函數定義) auto func(int i) -> int (*) [10] 返回陣列指針
int func(int)
與int func(const int)
會重複宣告 (頂層const的有無對於形參的區分沒有影響)int func(int&)
與int func(const int&)
會發生函數過載(底層const影響形參的區分)C++中,名字查詢發生在型別檢查之前
內聯說明只是向編譯器發出的一個請求,編譯器可以選擇忽略這個請求
適用於短而常用的函數
行內函式和constexpr函數可以在程式中多次定義,但多次定義語句必須完全一致,所以通常定義在標頭檔案中
assert*(expr);
首先對expr*求值,如果表達式爲假(0),assert輸出資訊並終止程式的執行。如果表達式爲真(!0),assert什麼也不做
assert(expr);
assert宏定義在 cassert 標頭檔案中//預處理名字由前處理器管理
assert 的行爲依賴於 NDEBUG 預處理變數的狀態
如果定義了 NDEBUG ,則assert 什麼也不做
必須將#define NDEBUG 置於 <cassert> 標頭檔案之前
可以使用 NDEBUG 編寫自己的條件偵錯程式碼
func 輸出當前偵錯的函數的名字
FILE 存放檔名的字串字面值
LINE 存放當前行號的整形字面值
TIME 存放檔案編譯時間的字串字面值
DATE 存放檔案編譯日期的字串字面值
最佳匹配排列順序
宣告一個可以指向該函數的指針,只需要用指針替代函數名
int *pr(int)//返回值爲int指針的函數
int (*pr)(int)//函數指針
將函數名作爲一個值使用時,該函數自動地轉換成指針(& 此符可選)
函數指針的過載必須清晰界定選用的函數
函數指針賦值需要精確匹配
函數指針形參
形參可以是指向函數的指針(看起來是函數型別,其實是函數指針)
返回指向函數的指針
using F = int(int *,int);//function type
using PF = int(*)(int *,int);//pointer of function
F *f1(int);
//PF f1(int) 等價形式
//int (*f1(int))(int *,int);
//auto (*f1(int))(int *,int);
int (*(*f)(int))(int *,int)=f1;//函數指針 之前函數的指針
auto func(para_list)->Type(*)(para_list)
參考書籍 C++ Primer 第五版