0基础学C++ | 第11天 | 基础知识 | 引用

目录

引用的基本使用

 引用的注意事项

 引用做函数参数

 引用做函数的返回值

引用的本质


引用的基本使用

作用:引用就是给变量起别名,它不是新定义一个变量,而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。我的理解就是在某些场景下它比指针好用。

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

#include<iostream>
using namespace std;

int main()
{
     int a = 10; //定义各个整型变量
     int& b = a; //定义个引用
     cout << "a的值为:" << a << endl; // a的值为10
     cout << "b的值为:" << b << endl; // b的值为10
     system("pasue");
     return 0;  
}

引用的注意事项

1、引用必须初始化

         int &b; //这是不可以的

2、引用初始化后,就不可以更改

        int a = 10;
        int c = 20;
        int& b = a;
        int& b = c; //b引用了a之后,就不能再引用c 不可以再进行更改

3、引用还可以继续有引用

        int a = 10;
        int& b = a;
        int& c = b; //b引用了a, c引用了b

4、一个变量可以有多个引用

        int a = 10;
        int& b = a;
        int& c = a; //b c都引用了a

5、可以对任何类型做引用

​#include<iostream>
using namespace std;

int main()
{
     int a = 10; //定义各个整型变量
     int &b = a; //必须初始化 ,此时 b 和 a 是相等的共享空间 相当于b就是a的别名(小名)
     int c = 20; //引用初始化后,不可以更改
     b = c; //这是复赋值操作,不是更改引用

     cout << "a的值为:" << a << endl; // a的值为20
     cout << "b的值为:" << b << endl; // b的值为20
     cout << "c的值为:" << c << endl; // b的值为20

     system("pasue");
     return 0;  
}

引用的两大应用场景(做函数参数、做返回值)

引用的两大应用场景分别是1、做函数参数,2、做返回值

1、做函数参数

引用做函数的参数,作用相当于指针,可以改变变量本身,前面说形参不能修饰实参,但是用指针的时候可以修饰,但是利用指针来传参,还需要解引用,但是采用 引用来传参则不需要这么麻烦,因为传参传一个实参过去,接收时使用引用,此时该引用就是形参的别名,形参的别名改变会改变形参本身。

2、做返回值

用引用接收返回值时,不再需要开辟额外的空间来存函数返回值时产生的临时变量,在main()函数中将临时变量拷贝给接收值。对于像静态变量、全局变量等这些出了作用域不会销毁的对象,就可以使用 传引用返回 ,它不用拷贝,返回的直接就是返回变量的别名,这能够极大地提高效率(目前简单粗暴的理解)

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

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

​​#include<iostream>
using namespace std;

//交换函数
int Swap01( int a,int b)
{
    int temp = a;
    a = b;
    b = temp;
    return 0;
} 

//1、值传递
int Swap02( int a,int b)
{
    int temp = a;
    a = b;
    b = temp;
    cout << "Swap02 a的值为:" << a << endl; // a的值为20
    cout << "Swap02 b的值为:" << b << endl; // b的值为10
    return 0;
}

//2、地址传递
int Swap03( int *a,int *b)
{
    
    int temp = *a;
    *a = *b;
    *b = temp;
    cout << "Swap03 a的值为:" << a << endl; // a的值为20
    cout << "Swap03 b的值为:" << b << endl; // b的值为10
    return 0;
}

//3、引用
int Swap04( int &a,int &b)
{
    int temp = a;
    a = b;
    b = temp;
    cout << "Swap04 a的值为:" << a << endl; // a的值为20
    cout << "Swap04 b的值为:" << b << endl; // b的值为10
    return 0;
}

int main()
{
     int a = 10; 
     int b = 20; 
     Swap01(a,b); //值传递 形参不会修饰实参
     Swap03(&a,&b); //地址传递 形参会修饰实参
     Swap04(a,b); //引用传递 形参会修饰实参
     cout << "a的值为:" << a << endl; // a的值为10
     cout << "b的值为:" << b << endl; // b的值为20
    
     cout << "Swap03 a的值为:" << a << endl; // a的值为20
     cout << "Swap03 b的值为:" << b << endl; // b的值为10

     cout << "Swap04 a的值为:" << a << endl; // a的值为20
     cout << "Swap04 b的值为:" << b << endl; // b的值为10

     system("pasue");
     return 0;  
}

引用做函数的返回值

​​#include<iostream>
using namespace std;

 //引用做函数的返回值
//1、不要返回局部变量的引用
int& test01() // int& 表示a最为一个引用返回
{
    int a = 10; //局部变量存放在四区中 栈区 执行完就释放掉了
    return a;
}

//2、函数的调用可以作为左值
int& test02()
{
     static int a = 10;// 加 static 变为静态变量存放在四区中的全局区 执行完整个程序由系统释放掉了
     return a;

}

int main()
{
     
     int &ref1= test01();
     int &ref2= test02();
     cout << "ref1的值为:" << ref1 << endl; // ref1的值为20
     cout << "ref1的值为:" << ref1 << endl; // 出现错误乱码 因为局部变量 执行完这个代码 空间被释放掉了,第二次输出就会出现错误不一致情况

     test02()=1000; //作为左值(也就是左边的值)
     cout << "ref2的值为:" << ref2 << endl; // ref2的值为1000
     cout << "ref2的值为:" << ref2 << endl; // ref2的值为1000

     system("pasue");
     return 0;  
}

引用的本质

本质:应用的本质在C++内部实现是一个指针常量

​​​#include<iostream>
using namespace std;

//发现是引用,转化为 int* const ref = &a

void test01(int& ref) 
{
    ref = 10; //ref是引用,转化为*ref = 10
   
}


int main()
{
     int a = 100;
    //自动转为为int* const ref = &a,指针常量是指针指向不可改变,所以说为什么引用不可以更改
     int& ref= a;
     ref = 20; 
     cout << "a:" << a << endl; 
     cout << "ref:" << ref << endl; 

     test01();

     system("pasue");
     return 0;  
}

​

关于引用的知识点还没学完,先写到这,感兴趣的可以参考这篇文章C++ 引用(&)的超详细解析(小白必看系列)_c++ &-CSDN博客,虽然写的很详细,对我而言还是有有很多地方需要仔细研究才能懂。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值