无聊的帖子

99 阅读4分钟

引用做函数的返回值

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;

}