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