c++基础知识02——函数引用


二.引用

2.1 引用的基本使用

引用的作用:为变量起别名

语法:数据类型 &别名=原名

  1. int a=10 表面上是创建了一个变量,但实质上创建了一块内存,占4个字节,内容为10,使用变量a来操作这块内存

引用即为再次创建一个变量名,同时指向与变量a所指的内存,与变量a有同样的等级,是同块内存的不同叫法而已

2.注意事项:(1) 引用必须初始化 如int &b就是不合法的,必须要指定b是谁的别名

(2) 引用在初始化后不可改变

int a=10; int c=20;

int &b=a;//声明b是a的一个别名

int &b=c;//又声明b是c的一个别名,但不可行,会报错

2.2引用做函数参数

调用函数传参数的方式(之前):值传递(形参不可修饰实参)和地址传递(要想形参修饰实参必须要用地址传递,指针)

今天介绍另一种传参的方式:引用用函数参数

作用:函数传参时,可以利用引用的技术让形参修饰实参

优点:可以简化指针修饰实参

#include<iostream>
using namespace std;
// 交换函数
//1.值传递
void myswap01(int a,intb)
{
    int temp=a;
    a=b;//结果是swap01->a=20   awap01->b=10 只是形参发生改变实参并没有 
    b=temp;
} 
//2.地址传递
void myswap01(int *a,int *p)
{
    int temp=*a;//指针来传递地址 
    *a=*b;
    *b=temp;
} 
//3.引用传递
void myswap03(int &a,int &b)
{
    int temp=a;//调用函数时 &a=a,故swap0->a是实参a的别名,操作同一块内存 
    a=b;
    b=temp;
} 
int main()
{
    int a=10;
    int b=20;
    myswap01(a,b);//值传递,形参不可修饰实参 
    myswap02(&a,&b);
    myswap03(a,b);//通过引用传参产生的效果同按地址传递的结果一样 
}

2.3 引用做函数的返回值

作用:引用时可以作为函数的返回值存在的

注意:不要返回局部变量

用法:函数调用作为左值

#include<iostream>
using namespace std;
//不要返回局部变量的引用
int &test01()
{
    int a=10;//局部变量存放在栈区
    return a; 
} 
//函数的调用可以作为左值
int &test02()
{
    static int a=10;//静态变量,存放在全局区,其区上的数据在程序结束后释放
    return a; 
} 
int main()
{
    int &ref=test01();
    cout<<ref<<endl;
    cout<<ref<<endl;//第一次结果是正确的,是因为编译器做了保存,而第二次就是随机数了,因为局部变量的内存在函数调用完成后已经释放
    
    int &ref2=test02();//等号左边是左值,test02是a的别名,而ref2又是test02的别名,所以ref02也是a的别名
     cout<<ref<<endl;
     cout<<ref<<endl;
     return 0;//如果函数的返回值是引用,这个函式调用可以作为左值 
}

2.4 引用的本质

本质:在c++内部实现是一个指针变量

#include<iostream>
using namespace std;
void func(int &ref)//编译器发现是引用时,转换成int *const ref=&a; 
{
    ref=100;//ref是引用,转换成*ref=100 
} 
int main()
{
    int a=10;
    int &ref=a;//自动转换成int *const ref=&a 指针常量是指针指向不可改,也说明为什么 引用不可更改
    ref=20;
    cout<<ref<<endl;
    cout<<a<<endl;
    func(a);
    cout<<ref<<endl;
    cout<<a<<endl;
    return 0; 
}

2.5 常量引用

常量引用主要用靠修饰形参,防止误操作,在函数形参列表中可以加const修饰形参防止形参改变实参

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM