C++ primer 中文第三版 閱讀筆記 第七章

一、數組參數的傳遞

1. 數組永遠不可能傳值方式傳遞

2. 假如有f(int a[]) 或者 f(int *) 或者 f(int []) 或者f(int [10])這些都是一樣的,他們是別的都是int * 並不是我們想的是個數組,首先它是不帶長度的,並且int a; f(&a),這個是有潛在問題的。對於f(int [10])這種定義,int a[2],f(a);這個並不是長度爲10的數組,也有潛在問題。總之,牢記一句話都是int *的,並不等價於數組。

3. 爲了避免上面的問題,我們有一個好辦法。就是傳遞數組的引用。具體使用是f(int (&a)[10]),這樣他就要求傳遞的數據必須是長度爲10的int類型數組了。像int a; f(&a)編譯器就會報錯的。int a[2], f(a)也會報錯的。

總之一般數組傳遞有這樣2種用法:

void fun(int a[], int size);//這種是有一定類型風險的,但用法靈活

void fun(int (&a)[10]);//這種對於類型還是比較安全的,但他要求就必須是長度爲10的數組。用法比較死板

另外,對於多維數組,必須至少要指明除第一維的其他所有維的長度,傳遞int a[][10] ok, 但是int a[][] 或 int a [10][]就不ok了


二、缺省實參

void fun(int a = 1, int b = 2);

1. 調用時:

1>. fun(2) 相當於調用了 fun(2, 2)

2>. fun() 相當於調用了fun(1, 2)

3>. fun(, 2)不等價於fun(1, 2)

這是因爲缺省參數只能替換已提供參數的後面的部分。

2. 另外,以爲缺省參數是從參數尾部通過位置確定的,所以假如有缺省參數那麼必須從最左邊的缺省參數到參數尾部所有參數都設置缺省參數。

所以:

void fun(int a, int b = 1, int c, int d = 2);

這個定義是不對的,主要問題在於b,它定義了缺省參數,但是c並沒有定義,所以錯誤。應該爲

void fun(int a, int b = 1, int c = 0, int d = 2);

3. 一個參數只能在一個文件被設置一次缺省參數

三、未知個數參數

用...來表示

用法 fun(int a, ...)

va_start、va_arg、va_end來訪問未知參數,需要#include<cstdarg>

va_list arg_ptr;

va_start(arg_ptr, a) 函數將參數arg_ptr設置爲可變參數列表的第一個參數。

int b = va_arg(arg_ptr, int)將arg_ptr的int類型數據返回,將arg_ptr後移。

va_end(arg_ptr)將參數arg_ptr設置爲可變參數列表的最後一個參數。


四、返回值

一般都是值返回分爲值返回和引用返回。值返回是很常見的返回,這裏講一下引用返回。

爲什麼要引用返回呢?因爲值返回是要一個賦值的,這樣子效率會降低,利用引用返回會快一些。

引用返回一定要注意不能是返回局部變量,因爲它是聲明在棧裏的,函數結束後空間被釋放,返回引用無效。

用法

int &get()

{

return 0;

}

但是要是僅僅是爲了效率考慮,不希望返回值被修改可以這樣用

const int &get();


五、內聯函數

inline

inline函數必須調用該函數在每個文本文件中的定義,對於不同文件,假如出現了同名的內聯函數,那麼定義必須一樣。注意這裏說的是定義,不是實現。這樣子的話一般建議放在頭文件中。


六、c++中編寫c

extern "C" , 它可以控制一個函數的定義,也可以控制一個語句塊。但要注意,它不能出現在函數中(包括main函數)。

一般用法是這樣的

extern "C" int get();

extern "C"

{

int get();

void set();

}

這樣是錯誤的

void main()

{

extern "C" int get();

}


七、main()函數

int main(int argc, char * argv[])


argc是命令個數,argv是空格分開的char*數組。可以用argv[i]訪問。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章