總結:6.1 基礎 :
陣列 和 函式不能充當返回值, 可以使用指向他們的指標.
自動變數: 生存週期 = 作用域
區域性靜態變數: 生存週期 > 作用域
函式宣告 = 函式原型
6.2 引數傳遞:
值傳遞: 變數,指標,函式(傳值呼叫)
引用傳遞 : 避免大量拷貝,const 修飾能擴大其型別容納範圍。
形參的頂層const會被忽略掉.
陣列當作引數會被退化成指標 [ 指向下一維度陣列指標]
解決方式:
1.使用整數形參 說明其退化前的維度
2.使用陣列引用方式傳遞, 但是就只能傳遞固定維度的陣列了
可變引數列表:
1.initializer_list :
內部全是const, 且拷貝賦值共享元素.
2.可變引數模板
3.c介面的 ... , 此時應該使用c支援的資料型別當作實際引數.
6.3 return :
使用返回值初始化乙個臨時量。
c++11規定可以返回 {}, 只要接受的資料能接受 [ 返回型別不能是陣列型別]
返回指向陣列的指標的方式:[引用也適用]
1.型別別名:
using arrt = int[10];
arrt *func(int);
2.不使用型別別名:
int (*func(int))[10];
3.尾置返回型別[c++11]
auto func()->int(*)[10];
4.decltype方式:
int a[10];
decltype(a) *func();
6.4 函式過載:
返回型別, 頂層const不能充當過載的條件。
const_cast 可以讓非常量版本函式呼叫 常量版本的函式。[指標 和 引用型別形參]
6.5 特殊的語言特性:
預設實參:
書寫在都檔案當中,可多次定義.
內聯函式:
定義在標頭檔案, 可展開, 無複雜控制語句的函式
constexpr 函式:
引數型別 和 返回值都必須是字面值型別。
函式體只能有一條return 語句
返回值是否是constexpr 看引數。
除錯幫助:
cassert 標頭檔案中的巨集, 以及__func__ 和 __file__,__time__,
__line__,__time__ 等預處理變數
6.6 函式匹配:
候選函式集合 : 名字 和 可見性來篩選
可行函式集合 : 引數的數量 和 可行的型別匹配篩選
最佳匹配: 每單個引數來看, 如果每個引數的最佳匹配相同就有最佳匹配, 否則ambiguous [
有一套等級劃分來決定型別匹配的優劣 ]
6.7 函式指標:
引數是函式指標:
void func(int f(int,int))
void func(int (*pf)(int,int)) //等價於上
返回函式的指標:
別名方式:
using functype = int (int, int);
functype * func();
不用別名方式
int (*func())(int, int){}
尾巴置型別放複雜型別:
auto func() -> int (*)(int, int);
c primer 筆記,第六章
區域性靜態物件使用static宣告,宣告一次後下次再呼叫該函式,則該宣告語句則被忽略 練習6.7,第一次被呼叫時返回0,以後每次呼叫返回值加一 size t count 當函式無需修改引用形參的值時最好使用常量引用 使用實參初始化形參時會忽略頂層const 使用普通引用會極大地限制函式所能接受的實參...
c primer 筆記 第六章 函式
1.函式的返回型別不能是陣列型別或函式型別,但可以是指向陣列或函式的指標 返回陣列的指標 1 使用型別別名 typedef int arrt 10 using arrt int 10 與上面的宣告等價 arrt func int i 2 直接宣告 int func int i 10 3 使用尾置返回...
C primer 第六章筆記 初稿
用指標來傳遞多維陣列時,仍然需要傳遞二維的具體引數 可變形參 個人感覺就是乙個容器?如下class class1 private int a int b class class2 private int a int b int main class2 c2 1,2 return 0 莫名把賦值與判斷...