C++函數學習筆記

1. 同前所學,內置類型在函數定義未初始化則會變成未定義變量,不可直接使用。而非內置類型(如string)則系統會自動初始化爲空字符串。內置類型在函數外定義則系統會走動初始化爲其默認值,可以不經過顯示初始化直接使用。


2. 函數內定義的變量大多屬於自動變量,函數體結束後變量也就隨之銷燬,若需要變量在函數結束後不銷燬,可定義局部靜態變量,此變量從第一次初始化知道程序結束纔會被銷燬,而非函數結束。
如下變量num可以統計該函數被調用了多少次。

int  countNum(){
    static int num = 0;
    return ++num;
}
int _tmain(int argc, _TCHAR* argv[])
{
    for(int i =0;i!= 10;++i){
        cout<<countNum()<<endl;
    }
    return 0;
}

note:如果局部靜態變量沒有顯式初始化,則系統會默認初始化。


3.函數參數中const的用法也非常值得深入研究。
非常量引用不能接收const對象,也不能接收字面值或者需要類型轉換的對象。所以極大的限制了函數的使用範圍,故當函數不會改變參數的時候,儘量將參數定義爲const型。如下實例:

void example(char c){

}
void example1(char &c){

}
void example2(const char &c){

}


/***************************************************/
/*                   **對應字面值實例**              */    

example('c');//正確,普通的值傳遞
example1('c');//錯誤,將字面值傳遞給了普通引用,不能解析
example2('c');//正確,字面值傳遞給了congst引用


/***************************************************/
/*                   **對應const參數實例**           */ 
const char param= 'c';

example(param); //正確
example1(param); //錯誤,const對象傳遞給了普通非const對象。
example2(param); //正確


/***************************************************/
/*                   **對應類型轉換實例**              */  
void inti1(const int &i){}
void inti(int &i){}

double b = 3.14;
inti(b);//錯誤,需要類型轉換
inti1(b);//正確,const參數對需要類型轉換的依然適用

4 數組作爲函數參數時傳遞的實際上是數組的手元素的指針,故以下實現正確。

//函數定義
void print(int a[]){}
//函數調用
int i = 10;int a[2]={1,2};
print(&i);//正確,實際上函數接收的是int * 類型參數,故滿足
print(a);

//即函數等價於以下
void print(int *a){}


//以上如果不需要改變數組的值,則需要將參數定義爲const類型的。

使用引用能夠省去大量數據的拷貝時間,故應該在覈實的時候使用引用。


5 函數不應該返回局部變量的引用或者局部變量的指針,因爲局部變量在函數調用完成後就會銷燬,則引用指向了未知的地方指針也指向了未知的地方,引發錯誤。


6 可以利用引用返回左值,如primer pge226頁返回後成功的修改了數組的特定位的值。但是返回的不能是常量引用,否則就不能作爲左值。

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