引用做函数的返回值
1. 不要返回局部变量的引用。
int& text01()
{
int a=10;//局部变量存放在栈区(执行完text01后应该释放)
return a;
}
2. 函数的调用可以作为左值(等号左边的值)
int& text02()
{
static int a=10;//静态变量存放在全局区,全局区上的数据在程序结束后由系统释放
return a;//返回的是a的引用相当于把a的变量(即a本身)作为了返回
}
int main()
{
1. //int &ref=text01();
//cout<<”ref= ”<<ref<<endl;//10可以正常打印->编译器做了一次保留
//cout<<”ref= ”<<ref<<endl;//第二次错误,a的内存已经被释放了
2. int &ref2=text02();//函数调用
cout<<”ref2= ”<<ref2<<endl;//10
text02()=1000;//如果函数的返回值是引用,这个函数的调用可以作为做值
cout<<”ref2= ”<<ref2<<endl;//1000 ref2实际上是a的别名
}
引用的本质->指针常量
:在C++内部实现是一个指针常量(指针指向不可以改,但指针指向的值可以改)
Eg.void func(int& ref)
{
ref=100;
}
int main()
{
int a=10;
//编译器将其自动转化成int *const ref=&a;->也可以解释为什么引用不可以更改
//const限定表示指针的指向是固定的,但其值可以改
int& ref(别名)=a; //可以理解为指针变量的名称为ref其中存放的数据是a的地址
ref=20; //内部发现ref是引用,帮我们自动转化为指针*ref(指针的解引用)=20;
return 0;
}
常量引用
作用(使用场景):常量引用主要用来修饰形参,防止误操作
在函数形参(函数括号里的都是形参)列表中可以加const修饰形参,防止形参改变实参
Eg.void showValue( const int &val)//加上了const value就不可以修改了(不会让参数发生改变)
{
Val=1000;
Cout<<”val= ”<<val<<endl;
}
int main(){
//Int a=10;//堆区
//const int& ref=10;//错误 引用必须引用一块合法的内存空间,这里的10在常量区
加上const 之后编译器将代码修改:int temp=10;const int & ref=temp;指针指向该变量
并且加入了const后变成了只读,不可以修改。
Int a=100;//通过一个函数打印a的值
showValue(a);//a是原名
Cout<<”a= ”<<a<<endl;//1000
函数的提高
一.函数的默认参数
在C++中,函数的形参列表中的形参是可以有默认值的。
语法:返回值类型 函数名 (参数=默认值){}
eg.//函数默认参数
int func(int a,int b,int c)
{
return a+b+c;
}
int main()
{
func(10,20,30);
return 0;
}
注意:
int func(int a,int b=20,int c=30)//其中啊b,c均有默认值
{
return a+b+c;//70传了就用传递的值,没有就用默认值
}
int main()
{
func(10,30);
return 0;
}
注意事项:
1. 如果某个位置已经有了默认参数,那么从这个位置往后,从左到右必须有默认值即参数必须=默认值。
2. 如果函数声明有默认参数,函数实现就不能有默认参数 即:声明和实现只能有一个有默认参数。
二.函数默认参数
1.C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置
语法:返回值 函数名((只写)数据类型){}
Eg.void func(int a,int)//function->函数
{
cout<<”this is func”<<endl;
}
Int main(){
Func(10,10);//必须有第二个10
//目前阶段的占位参数还用不到
//占位参数 还可以有默认参数
}
三. 函数重载
1. 函数重载概述:
作用:函数名可以相同,提高复用性
必须满足的条件:
.同一个作用域下
.函数名称相同
.函数参数类型不同或者个数不同或者顺序不同
注意:函数的返回值不可以作为函数重载的条件
Eg.
//函数重载的满足的条件:
//1.同一个作用域下(满足)
//2.函数名称相同(满足)
//3.函数参数类型不同或者个数不同或者顺序不同(不满足)
.Void func()//均在全局作用域
{
Cout<<”func的调用”<<endl;
}
.Void func((添加)int a)
{
Cout<<”func的调用!”<<endl;
}
.Void func(double a)
{
Cout<<”func(double a)的调用!”<<endl;
}
.void func(int a,double b)
{
Cout<<”func的调用”<<endl;
}
Int main()
{
.void func(double b,int a)
{
Cout<<”func的调用”<<endl;
}
Int main()
{
Func ();//根据传入的不同参数可知调用的第一个
Func ();//根据传入的不同参数可知调用的第二个
Return 0;
}