第七章 函數

1. 函數不能返回另一個函數或者內置數組類型,但是可以返回指向函數的指針,或指向數組元素的指針

int *foo_bar() {/*....*/}

2. 函數必須指定返回類型,至少也要void


3. c++是一種靜態強類型語言,每一次函數調用,編譯時都會檢查實參。


4.如果形參具有非引用類型,則複製實參的值,對形參的修改不會影響實參的值,非引用形參就如何實參的局部副本;如果形參是引用類型,則它只是實參的別名,任何對形參的改動也會影響到實參。

對於指針形參,初始化的時候也是複製實參指針,所以如果將新指針值賦給形參,那麼不會改變主調函數中的實參指針,但是如果修改形參指針指向的對象的值,那麼此時也會實參指針指向的值。

void reset(int *ip)
{
	*ip = 1;
	ip = 0;
}

通過運行reset函數,那麼實參指針依然是原來的值,但是指向的對象的值會變成1。

如果要保護實參指針的值不被修改,那麼需要定義const int *ip


5.可以將指向const對象的指針初始化爲指向非const對象的指針,但是不可以把指向非const對象的指針初始化爲指向const對象的指針。

如:

void use_ptr(const int *p)
{
	//....
}
此時可以用int*也可以用const int *的實參調用use_ptr函數,但是對於上面的reset函數只能傳遞int* 指針。


6.對於函數的形參是非引用類型的,那麼無論形參是否爲const,都可以把const和非const實參傳遞,因爲實參是以副本的形式傳遞的,那麼就不會更改到實參中的值,自然就無所謂的const和非const區分。


7.複製實參也不是很多情況下都適合,如果需求要修改實參的值,或者大型對象作爲參數傳遞,那麼複製的話就需要花費很大的代價,或者沒辦法實現對象的複製,那麼此時可以將形參定義爲引用或者指針類型。


8. 如果函數具有普通的非const引用形參,那麼不能傳遞const對象,因爲函數可以修改傳遞進來的對象,這違背了實參的const特性。

只要函數中不會修改實參對象,那麼就應該把函數的形參定義爲const類型,要不然這會影響到函數的適用範圍,因爲這樣子就不能使用const對象,比如:

string::size_type find_char(string &s, char c)
{
	/*find specify character*/
}
此時如果使用find_char("Hello World", 'O')那麼編譯是失敗。


9. 指向指針的引用  int  *&v

10. 函數不應該有vector或其他標準庫容器類型的形參,調用含有普通的非引用vector形參的函數會複製vector的每一個元素,我們可以把形參聲明爲引用類型,之後我們學習到通過將指向容器中需要處理的元素的迭代器來傳遞容器。


11. 數組形參,

void printValues(int *) {}
void printValues(int []){}
void printValues(int [10]){}
這三種方式都是ok的,編譯器檢查的時候會忽略數組的長度,只是檢查類型。但是如果定義長度會引起誤解,如果實參數組的長度少於10,那麼就會引起越界訪問
如果是通過引用傳遞數組的,那麼編譯器不會把實參轉化爲指針,而是傳遞數組的引用本身,這時候數組大小成爲形參和實參類型的一部分,編譯器會檢查長度是否匹配
void printValues(int (&arr)[10])//保存10個int的數組的引用
void printValues(int &arr[10])//保存10個引用的數組

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


13.函數的返回值千萬不能返回局部對象的引用,也不能返回局部對象的指針。

14.static局部對象

15.內聯函數應該在頭文件中定義。因爲內聯函數的定義對編譯器必須是可見的,以便編譯器在調用點能夠內聯展開該函數的代碼


16.編譯器隱式的將類內定義的成員函數當作內聯函數

17.常量成員函數,即在成員函數聲明的形參表後面存在const

bool Sales_item::same_isbn(const Sales_item *const this, const Sales_item &rhs) const
{
	return (this->isbn == rhs.isbn);
}
也就是說,this其實是默認隱含形參,後面的const會修飾this  使用的話 total.same_isbn(trans),那麼此時隱含的this形參就是指向total的const Sales_item* 類型的指針


const對象、指向const對象的指針或引用只能用於調用其const成員函數,如果嘗試用它們來調用非const成員函數,那麼是錯誤的。



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