函式呼叫:
當函式呼叫發生時,程式用對應的實參初始化函式的形參,並將控制權轉移給被呼叫函式。
主調函式
的執行被暫停,
被調函式
開始執行。
函式體是乙個作用域:
函式體是乙個作用域。在函式體內定義的變數只在該函式中才可以訪問,名字之在該函式的作用域中可見,且只在函式執行時存在。這種變數稱為區域性變數。
函式形參:
1函式形參表中,
f如果兩個引數具有相同的型別,則其型別必須重複宣告:
int manip(int v1, v2) // error
int manip(int v1, int v2) // ok
2呼叫函式時,對於每乙個實參,其型別都必須與對應的形參型別相同,或具有可被轉換為該形參型別的型別。比如,
double
可以通過截斷
(truncation)
被隱式轉換為
int型。
非引用形參
-指標形參:
如果函式形參是非
const
型別的指標,那麼函式可以通過指標實現賦值。
如果函式形參是
const
型別的指標,那麼函式不可以修改指標指向的值。
非引用形參
-const
形參:如果該函式使用非引用的非
const
形參,則既可給該函式傳遞
const
實參也可傳遞非
const
實參。引用形參:
引用形參的好處很多,比如將主調函式返回額外的結果,比如避免一些沒有必要的複製。
非const
型別的引用形參比
const
型別的引用形參有更多限制。
比如:int incr(int &val)
int main()
從上看出,應該將不需要修改的引用形參定義為
const
引用。普通的非
const
引用形參在使用時不太靈活。這樣的形參既不能用
const
物件初始化,也不能用字面值或產生右值的表示式實參初始化。
引用形參
-指向指標的引用:
顧名思義,乙個指向指標的引用。寫法很奇特,
int *&var
。表示乙個引用,它和
int型物件的指標相關聯。這個定義要從右往左理解。
void ptrswap(int *&v1, int *&v2)
交換後,
v1指向原來
v2所指的物件,
v2指向原來
v1所指的物件。
vector
等容器型別的形參:
通常用迭代器做形參。如果非要用
vector
做形參,那麼也應該宣告為引用型,否則非引用形參會導致函式複製
vector
中的每乙個元素。
陣列形參
(指標型):
模擬vector
,使用指向陣列元素的指標來處理陣列。
因為使用陣列時,一不能複製陣列;二使用陣列名字時,陣列名會自動轉化為指向其第乙個元素的指標。
以下三種定義是等價的,形參型別都是
int*
:void printvalues(int*)
void printvalues(int)
void printvalues(int[10])
看下面一段**:
void printvalues(constint ia[10])
}int main()
;printvalues(&i); // ok: &i is int*; probable run-time error
printvalues(j); //ok: argument has type int*;
return 0;
}以上**說明:當編譯器檢查陣列形參關聯的實參時,它只會檢查實參是不是指標、指標的型別和陣列元素的型別時是否匹配,而不會檢查陣列的長度。
引用型陣列形參:
如果形參是陣列的引用,編譯器不會將陣列實參轉化為指標,而是傳遞陣列的引用本身。在這種情況下,陣列大小成為形參和實參型別的一部分。編譯器檢查陣列的實參的大小與形參的大小是否匹配
:// ok: parameter is a reference to an array; size of array is fixed
void printvalues(int (&arr)[10])
//&arr
兩邊的圓括號是必需的,因為下標操作符具有更高的優先順序:
int main()
;int k[10] = ;
printvalues(&i); // error: argument is not an array of 10 ints
printvalues(j); // error: argument is not an array of 10 ints
printvalues(k); // ok: argument is an array of 10 ints
return 0;
}陣列使用的雷區:
任何處理陣列的程式都要確保程式停留在陣列的邊界內。
有兩種技巧確保函式的操作不超出陣列實參的邊界。
第一種方法是在陣列本身放置乙個標記來檢測陣列的結束。
c 風格字串就是採用這種方法的乙個例子,它是一種字元陣列,並且以空字元
null
作為結束的標記。處理
c 風格字串的程式就是使用這個標記停止陣列元素的處理。
第二種方法是傳遞指向陣列第乙個和最後乙個元素的下乙個位置的指標,模擬標準庫技術。
return
語句:在
void
函式型別中,
return
語句可以返回另乙個型別同樣是
void
的函式的呼叫結果。
含有return
語句的的迴圈後面如果沒有提供
return
語句,將有極大危險。因為如果這個迴圈根本就沒有執行,那麼執行時就會出問題。這個問題在編譯階段查不出。
理解返回引用至關重要的是:千萬不能返回區域性變數的引用,也不能返回指向區域性物件的指標。因為當函式執行完畢,這些物件的空間將被釋放。
C Primer 筆記(第七章)
函式可以看作程式設計師定義的操作。與內建操作符類似,每個函式都會實現一系列的計算,然後生成乙個計算結果,不同的是,函式有自己的函式名,而且運算元的個數沒有限制。函式的定義 形式 返回型別 函式名 形參列表 引數傳遞 引用實參 void swap int v1,int v2 引用形參直接關聯其所繫結的...
C Primer 筆記 第七章 類
類的成員函式通過乙個名為 this 的隱式形參來訪問呼叫它的那個物件,在呼叫時,用請求該函式的物件位址初始化 this,this 是乙個常量指標。要將 this 宣告成指向常量的指標只需在函式的形參列表後加上 const。定義在類內部的函式是隱式的 inline 函式。類外部定義的成員名字必須包含其...
c primer第七章類小結 7
第七章 類 c 中定義自己的資料型別叫做類。資料抽象是依賴於具體實現與物件能執行的操作分離開來的一種技術 封裝實現介面和實現分離,類的基本思想是資料抽象和封裝。類的 介面包括使用者所能執行的操作 類的實現包括類的資料成員 負責介面實現的函式體以 及定義類所需的各種私有函式,15章說核心思想是資料抽象...