函數
建立自己的函數必須自行處理這3方面 - 定義、提供原型和調用。
庫函數是已經定義和編譯好的函數,同時可以使用標準標頭檔提供其原型,因此只需要正確的調用這種函數即可。
C++對於傳回值的類型有一定的限制:不能是數組,但可以是其他任何類型 —— 整數、浮點數、指標,甚至可以是結構和對象!(雖不能直接返回數組,但可以將數組作為結構或對象組成部分返回。)
函數原型不要求提供變數名,有類型列表就足夠了。C++中函數原型是必不可少的。
函數和數組
C++將數組名解釋為其第一個元素的地址:
cookies == & cookies[0]cookies[i] == *(cookies + i)
該規則有一些例外:
1、數組聲明使用數組名來標記儲存位置
2、對數組使用sizeof得到整個數組的長度
3、將地址符&使用者數組名時,將返回整個數組的地址,
數組的函數原型
int sum_arr(int arr[], int n)int sum_arr(int *arr, int n)
傳遞常規變數時,函數將使用該變數的拷貝;但傳遞數組時,函數將使用原來的數組。
為了防止函數無意中修改數組的內容,可在聲明形參時使用關鍵字const
void show array(const double ar[], int n);
指標和const
1、讓指標指向一個常量對象,可以防止指標來修改指向的值。
int age = 39;const int * pt = &age;
pt的聲明並不意味著它指向的值實際上就是一個常量,而只是意味著對pt而言,這個值是常量。例如,pt指向age,而age不是const。可以直接通過age變數來修改age的值,但不能使用pt指標來修改它。
const只能防止修改*pt指向的值,而不能防止修改pt的值。也就是說可以將一個新地址賦值給pt。
可以將常規變數賦值給指向const的指標,因此還有兩種可能:將const變數的地址賦值給指向const的指標、將const的地址賦值給常規指標。
const float g_earth = 9.80;const float *pe = &g_earth; //valid const float g_moon = 1.63;float *pm = &g_moon; //invalid
2、將指標本身聲明為常量,這樣可以防止改變指標指向的位置。
int sloth = 3;const int * ps = &sloth; // a pointer to const intint * const finger = &sloth; //a const pointer to int
關鍵字const的位置不同,使得finger只能指向sloth,但允許使用finger來修改sloth的值。中間的聲明不允許使用ps來修改sloth的值,但允許將ps指向另一個位置。簡而言之,finger和*ps都是const,而*finger和ps不是。
3、指標和值均為常量
double trouble = 2.0E30;const double * const stick = &trouble;
此時,stick只能指向trouble,並且不能用stick來修改trouble的值。
函數和C-風格字串
C-風格字串由一系列字元組成,以Null 字元結尾。數組相關知識也適用於C-風格字串。例如,將字串作為參數時意味著傳遞的是地址,也可以使用const來禁止對字串進行修改。
將字串作為參數傳遞給函數,有3中表示字串的方式:
char數組;
用引號括起的字串常量(也成為字串字面值);
被設定為字串的地址的char指標
char ghost[15] = "galloping";char * str = "galumphing";
將字串作為參數來傳遞,實際上傳遞的是字串第一個字元的地址。意味著函數原型應聲明為 char *類型。
C-風格字串與常規char數組之間的一個重要區別是,字串有內建的結束字元,這意味著不必將字串長度作為參數傳遞給函數。
函數和string對象
雖然C-風格字串和string對象的用途幾乎相同,但與數組相比,string對象與結構更相似。例如,可以將一個結構賦給另一個結構,也可以將一個對象賦值給另一個對象。可以將結構作為完整的實體傳遞給函數,也可以將對象作為完整的實體進行傳遞。如果需要多個字串,可以聲明一個string對象數組,而不是二維char數組。
函數和結構體
與數組名就是數組第一個元素的地址不同的是,結構名只是結構的名稱,要擷取結構的地址,必須使用地址運算子&。
傳遞結構的地址
調用函數時,將結構的地址(&st)而不是結構本身(st)傳給給它;
將形參聲明為指向st的指標,即st *類型。如果不允許修改結構,可以使用const修飾符;
由於形參是指標而不是結構,因此應用間接成員運算子(->),而不是成員運算子(.)。
函數指標
與資料項目相似,函數也有地址。函數的地址是儲存其機器語言代碼的記憶體的開始地址。可以編寫將另一個函數的地址作為參數的函數,這樣子第一個函數將能夠找到第二個函數,並運行它。函數名即為函數的地址