C++引用操作

一. 前言

在学习C++引用操作之前,我们了解一下相关概念。

C++可以是一种面向对象编程,它的内存分区中主要分为4个区域,分别是代码区,全局区,栈区以及堆区。

其中代码区主要存放函数体的二进制代码,由操作系统进行管理。

全局区主要用来存放全局变量和静态变量以及常量。

堆区主要用来存放函数的参数值,局部变量等,由编译器自动分配释放,也就是说是不能一直存在的。

栈区则由程序员分配和释放,如果程序员不释放,程序结束时由操作系统自行释放。

之所以分为不同的区域,就是为了让不同区域存放不同的数据,赋予不同的生命周期,给我们更大的灵活编程。

另外值得注意一点的是,在普通变量前面加上static之后,该变量就成为了静态变量。

二. 引用的本质和操作

C++中的引用本质上就是给一个变量起别名。它的语法类型为:数据类型 & 别名=原名。

如下所示:

复制代码
int main(){
    int a=10;
    int &b=a;    //给这个a变量起一个别名b
    
    //打印的结果都为10
    cout<<"a="<<a<<endl;
    cout<<"b="<<b<<endl;
    
    //修改别名b的值,看a是否发生改变
    b=20;    
    cout<<"a="<<a<<endl;
    cout<<"b="<<b<<endl;
    
    return 0;
}

下面我们来看下运行结果:

由此我们可以发现,给一个变量所起的别名,里面存放的数据就为原来变量里面的数据,当对这个别名进行修改的时候,原变量也会被修改,由此引出C++引用的另外一个本质,也就是引用在C++内部实现是一个指针常量。

也就是说,int &b=a,会自动转换成int * const b=&a的形式,也就是别名b存放了原变量a的地址,可以直接修改a的值,这也就解释了后面为什么a和b都为20。

之前我们学过指针常量和常量指针的相关知识,所谓指针常量,就是指这个指针所指向的值可以修改,但是这个指针的指向却是不能够修改的,如下所示:

复制代码
int main(){
    int a=10;
    int &b=a;
    
    int c=20;
    b=c;    //这是错误的,不能再修改指针的指向了
    
    b=20;    //这才是正确的,可以修改值,但不能修改指向
}

值得注意的是,上面我们的引用操作后面都跟了一个原名,如果不加原名,在后面再添加上这样行得通吗?

下面我们来看一下:

cpp 复制代码
int main(){
    int a=10;
    int &b;
    b=a;
}

让我们来看一下运行结果会是怎么样的,是否会成功运行:

我们可以发现,程序直接报错了,提示我们这个别名b需要初始化。因此我们可以得出起别名的另外一个性质,也就是必须进行初始化操作,也就是引入一块合法的内存空间。

我们的解决办法有两种,一种就是给它初始化,也就是执行我们之前的int &b=a的操作。

另外一个就是在这个前面加上一个const,如const int &b=10;如果是之前的int &b=10,系统也会提示我们这个会报错,因为这个10是没有开辟一个合法内存空间的。但加上了const后,程序就不会报错了。

这是因为加上了const之后,编译器会自动修改代码,如下所示:

cpp 复制代码
int temp=10;
const int &b=temp;

这样编译器就不再报错。

相关推荐
2501_947575805 小时前
计算机毕业设计之jsp开山车行二手车交易系统
java·开发语言·hadoop·python·信息可视化·django·课程设计
国科安芯5 小时前
ASC4T245S分组双向控制架构深度解析:独立DIR/OE控制、QFN16封装与混合方向总线桥接
单片机·嵌入式硬件·物联网·fpga开发·架构·risc-v
骑士雄师5 小时前
java面试题 4:鉴权
java·开发语言
KaMeidebaby6 小时前
卡梅德生物技术快报|蛋白 N 端测序在重组贻贝融合蛋白表征中的应用,解决原核表达序列偏移工艺难题
前端·人工智能·物联网·算法·百度
时间的拾荒人7 小时前
C语言字符函数与字符串函数完全指南
c语言·开发语言
浆果02077 小时前
NanoTrack C++ — RK3588 实时目标跟踪
c++·目标跟踪·rk3588
ysa0510307 小时前
【并查集】判环
c++·笔记·算法
2501_948106917 小时前
计算机毕业设计之基于jsp教科研信息共享系统
java·开发语言·信息可视化·spark·课程设计
持力行7 小时前
C/C++ 中的 char*:它标识数组吗?为什么能用下标访问?
c语言·c++
取经蜗牛7 小时前
Python 第一阶段完全指南:从零到第一个实用工具
开发语言·python