文章目錄
- 7.1.1 函數的傳回型別
- 7.2.1 非引用形參
- 7.2.2 引用形參
- 7.2.4 數組形參
2011-8-30 21:45 周二 陰有中雨
關鍵字:形參,實參,函數
6.14 使用前置處理器進行調試
1 前置處理器定義的四種在調試時常用的常量:
__FILE__ 檔案名稱
__LINE__ 當前行號
__TIME__ 檔案被編譯的時間
__DATE__ 檔案被編譯的日期
2 assert 斷言預先處理宏,定義在cassert.h標頭檔中,使用時要包含這個標頭檔。
7.1 函數的定義7.1.1 函數的傳回型別
1 函數的傳回型別可以是內建類型、類類型、複合類型(如指標類型)、void類型。
2 函數不能返回另一個函數或者內建數群組類型,可以返回指向函數的指標或指向資料元素的指標的指標。
7.2 參數傳遞 7.2.1 非引用形參
1 形參的初始化與變數的初始化一樣:如果形參具有非參考型別,則複製實參的值;如果形參為參考型別,則它只是實參的別名。
2普通的非參考型別的參數通過複製對應的實參來初始化。由於是用的實參的副本來初始化形參的,所以函數並沒有訪問調用所傳遞的實參本身,也不會修改實參的值。
3 非引用實參僅表示對應實參的局部副本。對這類形參的修改僅僅是改變了局部副本的值。一旦函數執行結束,這些局部變數的值也就不會存在了。
4 指標引參
指標引參在函數內部不會改變指標實參傳遞形參之前所指向的對象,但可以改變其所指向對象的值。
int b = 20;
void reset(int *ip)
{
*ip = 0;
int a = 20;
ip = &b;
}
void main( void)
{
int i = 42;
int *p = &i;
cout<< " i = " << i<<endl;
cout<< " *p = "<< *p<<endl;
cout<<" p = "<< p<<endl;
reset(p);
cout<<" =========== "<<endl;
cout<< " i = " << i<<endl;
cout<< " *p = "<< *p<<endl;
cout<<" p = "<< p<<endl;
}
實際輸出:
i = 42
*p = 42
p = 0012FF60
===========
i = 0
*p = 0
p = 0012FF60
5 const形參
如果函數使用非引用的非const形參,則可給該函數傳遞const和非const的實參。這裡因為初始化複製了初始化的值,它只是複製,只是一個副本。
如果是const類型的形參。由於實參仍然是以副本的形式傳遞,因此仍然可以使用const對象或非const對象來傳遞實參,但此時在函數內部不能改變實參的這個局部副本,因為在函數內部,這個形參是個const對象。
6 複製實參的局限性
不適合複製實參的情況:
1) 當需要在函數中修改實參的值時。
2) 當需要以大型物件作為實參傳遞時。對實際的應用而言,這時需要佔用大量的時間和儲存空間。
3) 無法實現對象的複製時。
7.2.2 引用形參
1 const引用避免實參的複製和修改。
2 非const引用形參,只能與完全同類型的非const對象關聯。
3 應該將不需要修改相應實參的形參定義為const引用。
4 int *&v1 從右至左理解:v1是一個引用,與指向int類型對象的指標相關聯。當用這樣的形式做形參時,傳遞到函數內部的只是一個指標的別名。
5 一般不用容器作為函數的形參。
7.2.4 數組形參
1 可以將函數的數組形參寫成數組的形式,但都是ini *類型的。
2 寫成數組的形式,形參的長度會引起誤解。程式編譯時間,不會檢查數組形參中的數組形參長度,若想傳遞長度,只能顯示傳遞給函數長度或者傳遞給函數數組的第一個和最後一個元素的下一個位置的指標。。
3 通過引用傳遞數組。
形式: void printValues( int (&arr)[10] );
此時編譯器會檢查數組實參的大小與形參的大小是否匹配。