首页 > 编程语言 >0基础学C++ | 第11天 | 基础知识 | 引用

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

时间:2024-07-01 22:28:49浏览次数:3  
标签:11 10 变量 int C++ 基础知识 引用 返回值 ref

目录

引用的基本使用

 引用的注意事项

 引用做函数参数

 引用做函数的返回值

引用的本质


引用的基本使用

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

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

#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博客,虽然写的很详细,对我而言还是有有很多地方需要仔细研究才能懂。

标签:11,10,变量,int,C++,基础知识,引用,返回值,ref
From: https://blog.csdn.net/weixin_45754224/article/details/140101864

相关文章

  • 如何使用C++进行文件读写操作
    在C++中,我们可以使用标准库中的 <fstream>(文件流)来进行文件的读写操作。以下是一些基本的文件读写操作的示例。读取文件cpp复制代码#include<fstream>#include<iostream>#include<string>intmain(){std::ifstreamfile("example.txt");//打开文件以进行读取操......
  • C++11中如何创建线程
    在C++11中,创建线程变得非常简单和标准化,因为C++11引入了线程库(<thread>)。这个库提供了std::thread类,使得创建和管理线程变得更加直接和方便。以下是如何在C++11中创建线程的基本步骤:包含线程库:首先,你需要包含<thread>头文件,以便使用std::thread。定义线程将要执行的函数或可......
  • C++文件系统操作1 - 跨平台实现文件的创建和删除
    1.关键词2.fileutil.h3.fileutil.cpp4.filetype.h5.filesystem_win.cpp6.filesystem_unix.cpp7.源码地址1.关键词C++文件系统操作创建文件删除文件创建软连接刪除软连接跨平台2.fileutil.h#pragmaonce#include<string>#include<cstdio>#includ......
  • 深入解析C++标准库中的std::vector容器
    1.底层实现std::vector 是C++标准库中的一个模版类,用于动态数组。它的底层实现可以理解为一个动态分配的连续内存块,当需要更多空间时,内存会自动扩展。内存分配:vector 使用一块连续的内存存储元素。当插入新元素导致容量不足时,vector 会分配一块更大的内存(通常是当前容量......
  • C++仿SKData实现C原生指针管理
    template<typenameT>classHBData{public:HBData(T*other_data,size_tother_size,boolrelease):data(other_data),size(other_size),isDeepCopy(release){}HBData(constHBData&other){if(isDeepCopy&&data)......
  • C/C++ Dijkstra(迪杰斯特拉)算法详解及源码
    Dijkstra(迪杰斯特拉)算法是一种用于寻找带权重图中的最短路径的算法。它由荷兰计算机科学家EdsgerDijkstra于1956年提出,被广泛应用于网络路由算法和地图路线规划等领域。算法思想:初始化一个距离数组,用于保存起点到每个顶点的当前最短距离(初始时将起点距离设置为0,其他顶......
  • 信息学奥赛一本通C++版 1081:分苹果 答案
    目录【链接】【题目描述】【输入】【输出】【输入样例】【输出样例】【答案】【链接】1081:分苹果1081:分苹果【题目描述】把一堆苹果分给n个小朋友,要使每个人都能拿到苹果,而且每个人拿到的苹果数都不同的话,这堆苹果至少应该有多少个?【输入】一个不大于1000的......
  • 奥赛一本通C++版 1057解题思路(附加答案)
    链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1057题目:解题思路:先定义两个整型变量a和b,一个字符变量c,依次输入a,b,c。接着判断输入的运算符号是否等于+ || - || * || /(注意,这里的符号用单引号括起来)。如果运算符号等于加号,则进行加法运算,把a和b相加,......
  • win11添加开机自启动
    方法1win+R打开运行,输入shell:startup会打开一个文件夹将想要启动的程序快捷方式放进文件夹在设置里面搜索“启动”,可以看到开机启动项,确认已经打开。以上,针对不用管理员权限启动的程序,有效。方法2下面看需要管理员权限的:按Win+R,输入regedit,打开注册表编辑......
  • 用C++解决编程题目:角谷猜想
    学习目标:用C++编写简单的题目学习内容:#include<iostream>usingnamespacestd;intmain(){longlongn;cin>>n;while(n!=1){if(n%2==1){cout<<n<<"*3+1="<<n*3+1<<endl;n=3*n+1;......