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页返回后成功的修改了数组的特定位的值。但是返回的不能是常量引用,否则就不能作为左值。

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