c primer 筆記 第六章 函式

2021-07-17 03:33:39 字數 3216 閱讀 8759

1.函式的返回型別不能是陣列型別或函式型別,但可以是指向陣列或函式的指標

返回陣列的指標:

1)使用型別別名

typedef int arrt[10];

using arrt = int[10]; //與上面的宣告等價

arrt* func(int i);

2)直接宣告

int (*func(int i))[10];

3)使用尾置返回型別

auto func(int i) -> int(*)[10];

4)使用decltype

int odd=;

decltype(odd) *arrptr(int i);

因為decltypde並不把陣列型別轉換成對應的指標,所以decltype的結果只是個陣列,要想表示arrptr返回指標還必須在函式宣告時加乙個*

2.指標作為形參,當執行指標拷貝操作時,拷貝的是指標的值。拷貝之後,兩個指標是不同的指標,即進行了值傳遞

3.當形參有頂層const時,傳給他常量物件或非常量物件都可以。也就是說,僅僅根據有無頂層const無法實現兩個相互過載的函式

void func(int i)

void func(const int i) //錯誤,重複定義了func

4.由於不允許拷貝陣列,且使用陣列時通常會將其轉換成指標,所以當我們為函式傳遞乙個陣列時,實際上傳遞的是指向陣列首元素的指標

以下三個定義是等價的

void print(const int*);

void print(const int);

void print(const int[10]); //這裡的維度10並無效果,傳遞的仍只是乙個指向const int的指標

所以,如果想指定陣列的大小,就需要傳遞乙個表示陣列大小的形參,或者使用兩個指標,分別指向陣列的首和尾

5.陣列引用形參

以下宣告,形參是乙個指向陣列的引用

void print(int (&arr)[10]);  //arr是乙個有10個元素的整型陣列的引用

與以下宣告區別

void print(int &arr[10]);  //宣告成了引用的陣列,而並不存在引用的陣列

經過以上宣告的函式,只能作用於大小為10的陣列

6.傳遞多維陣列

以二維陣列為例,要傳遞的應該是乙個指向一維陣列的指標,這個一維陣列是二維陣列的首元素(陣列傳遞的都是指向首元素的指標)

void print(int (*matrix)[10] , int rowsize);  //傳遞乙個大小為[rowsize][10]的二維陣列

同樣區分 int *matrix[10] 與 int (*matrix)[10] ,與上面引用類似

以下宣告亦可

void print(int matrix[10] , int rowsize);

7.含有可變數量形參的函式

如果函式的實參數量未知但全部實參型別相同,則可以使用initializer_list型別的形參

void error_msg(initializer_listil);

initializer_list中的值都是常量值,無法改變其中元素的值

傳遞引數時,需要將引數序列放在一對花括號內

error_msg();

8.引用返回左值

呼叫乙個返回引用的函式返回左值,其他返回型別得到右值

char &get_val(string &str, string::size_type ix)

int main()

{ string s("a value");

cout<

9.預設實參

一旦某個形參被賦予了預設值,它後面的所有形參都必須有預設值

而且省略時只能省略尾部的實參,以下呼叫錯誤

window = screen( , , '?');

10.constexpr函式

函式的返回型別及所有形參的型別都得是字面值型別(算術型別,引用和指標),且constexpr函式被隱式地指定為內聯函式

11.實參型別轉換

排序:1)精確匹配

2)通過const轉換實現的匹配

3)通過型別提公升實現的匹配

4)通過算術型別轉換或指標轉換實現的匹配

5)通過類型別轉換實現的匹配

12.函式指標

宣告乙個函式指標

bool (*pf)(const string &, const string &);
bool b1 = pf("hello","goodbye");
bool b2 = (*pf)("hello","goodbye");  //與上面等價的呼叫
函式指標作為形參

void usebigger(const string &s1 , const string &s2, bool pf(const string &,const string &));  //形參看起來是函式型別,實際上是當成指標使用的

void usebigger(const string &s1 , const string &s2, bool (*pf)(const string &,const string &)); //與上面宣告等價

返回指向函式的指標

using f = int(int*,int);  //f是函式型別

using pf = int(*)(int*,int); //pf是函式指標型別

pf f1(int);

f *f1(int); //與上面宣告相同

int (*f1(int i))(int*,int); //直接宣告

auto f1(int i) -> int(*)(int*,int); //尾置返回型別

使用decltype,與返回陣列型別相似

C Primer 筆記 第六章 函式

函式的呼叫完成兩項工作 一是用實參初始化形參,二是將控制權轉移給被呼叫函式。函式最外層作用域中的區域性變數也不能使用與函式形參一樣的名字。形參和函式體內定義的變數都是區域性變數。普通的區域性變數只存在於其定義所在塊的執行時間內,內建型別的未初始化的區域性變數將產生未定義的值。區域性變數在程式第一次經...

C Primer 第六章 函式

1.實參 argument 是形參 parameter 的初始值。第乙個實參初始化第乙個形參,以此類推 2.c 中,名字有作用域,物件有宣告週期 lifetime 3.形參和函式體內部定義的變數統稱為區域性變數 local variable 4.自動物件 automatic object 只存在於塊...

C Primer 第六章 函式

1.1 區域性變數 1.2 函式宣告 1.3 分離式編譯 2.引數傳遞 2.2 傳引用引數 2.3 const 形參和實參 2.4 陣列形參 2.5 main 處理命令列選項 2.6 含有可變形參的函式 3.返回型別和 return 語句 3.3 返回陣列指標 4.函式過載 4.1 過載和作用域 5...