首页 > 编程语言 >C++中的引用

C++中的引用

时间:2024-07-12 20:00:54浏览次数:14  
标签:const 常量 对象 C++ 引用 我们 指针

        在C++中,我们要学习一个新的概念,叫做引用。引用不是对象,它只是给变量取一个别名。就好比,我们每个人总会右一下外号,或者是小名。当朋友或者家长不管是直接叫你的名字,还是叫你的小名,你都会答应。

引用的概念和定义

        引用不是定义一个新变量,而是给已存在的变量取一个别名,编译器不会为引用开辟空间,它和被引用变量使用的是同一块空间。

        类型&引⽤别名=引⽤对象;

        C++中为了避免引入太多复杂的符号,所以这里的引用符号和取地址符号&是同一个符号,只不过它们的用法不同,含义也不同。我们还是敲代码来看一看吧。

        可以看到我们定义了一个变量a,我们使用b取引用它,现在b就是a的一个别名,然后们分别打印a,b 我们发现它们的值是相同的。下面我们再来看一看它们的地址是不是相同的呢?

        可以看到它们两个都指向的同一块空间,自然都是同一个值。

         一般在初始化变量时,初始值会被拷贝到新建的对象中。然而定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用和它的初始值对象就一直绑定在一起。因为无法令引用绑定到另外一个对象,因此引用必须要初始化。

        简单来说,引用在定义时就必须要初始化,然后它就无法改变引用对象了。

        需要注意的是,引用本身不是一个对象,所以不能定义引用的引用。但是我们可以给别名取别名。

        我们之后对引用进行操作也就是对它引用的对象进行操作。

        通过代码可以看到,我们通过修改b的值,也修改了a的值。

引用的使用

        引用在实践中主要用做引用传参和引用做返回值中减少拷贝提高效率和改变引用对象同时改变被引用对象。

        比如我们使用函数交换两个数的值时,我们学习了C语言,首先想到的就是使用指针去交换两个值的大小。而当我们学习了C++中的引用后,我们就可以使用引用去交换两个变量的值了。

        可以看到原来a=10,b=20,最后打印出的时候,a=20,b=10。说明两个变量的值已经得到了交换。 相比于以前使用指针去交换两个变量的值,我们使用引用就方便了许多。

        后面我们还会学习到引用作为返回值的使用,我们后面再学习。

Const限定符

        有时候我们希望定义这样一种变量,它的值不能被改变。所以我们用到了Const 限定符。根据它的中文翻译,它的意思是恒定的,不变的,无法修改的(const)。从而我们可以知道,当我们定义一个变量的时候,在它前面加上const可以防止它被修改。

初始化与const

        对象的类型决定了其上的操作。与非const类型所能参与的操作相比,const类型的对象能完成很大一部分,但也不是所有的操作都适合。主要的限制就是只能在const类型的对象上执行不能改变其内容的操作。但是其它操作,比如:赋值,参与计算,转化成bool值等。

        看 ,num已经被const修饰,我们尝试着去修改它,编译器给我们报错了,说表达式必须是可修改的左值。num本身是一个变量,但当我们使用const去修饰的时候,它就成为了一个常量,我们知道常量就是不能够修改的。 

const的引用

        可以把引用绑定到const对象上,就像绑定到其他的对象上一样,我们称之为常量引用。我们前面说过const可以让对象无法修改,可以理解为变成了常量。我们下面都用常量引用来说。

        对于常量引用来说,需要记住的就是,只能小范围去引用大范围。      

        可以看到 num是一个常量,只能读取它。而我们想让一个可读可写的别名去引用它,这样就可能导致从rnum去修改到num,这是绝对不允许发生的。

        我们再来看一看,当我们使用一个常量别名(只能读,不能修改)去引用num(能读,能写)着就是合法的。因为num是一个大范围,rnum是一个小范围。而上面那种情况就是大范围去引用小范围了就错了,就有点本末倒置的意思。人家本体都不能修改,你一个别名却想要修改它,这肯定是不被允许的。

常量指针和指针常量

        与引用一样,也可以令指针指向常量或非常量。类似于常量引用,指向常量的指针不能用于改变所指对象的值。

         我们还是通过代码来分析。

        我们只需要记住,指针必须要和指向的对象类型相同。如上图,因为num的类型是const int 型,我们学习过指针,所以pnum2的类型就应该是const int * 型 。所以说我们称这样指向常量的指针为" 常量指针"。

        下面我们来学习一下指针常量。顾名思义,指针就是一个常量,指针的值无法修改,那么它永远就只能指向一个对象了。     

        可以看到我们定义了两个变量,然后初始化的时候我们让pnum指向了num1,然后我们试图去修改pnum指向的空间,结果遭到了编译器的反对,报错,说指针是一个常量,无法修改。这就和前面的const修饰常量一样,类比一下,应该就很好理解。

        最后还有一种指向常量的常量指针。也就是说该指针既不能修改指向的值,也不能修改它自己所指向的对象。 这句话听起来有点复杂,多理解一下就行了。

指针和引用的主要区别

在C++中,指针和引用都是用于处理内存地址的概念,但它们之间有一些重要的区别:

  1. 指针可以被重新赋值或者指向不同的内存地址,而引用在被初始化后就不能再引用其他对象,因此引用一般被认为是别名。

  2. 指针可以为空(nullptr),即不指向任何内存地址,而引用必须引用一个有效的对象。

  3. 指针使用“*”来访问保存在其指向地址中的值,而引用直接使用变量名来操作对象的值,因此引用操作起来更加方便。

  4. 指针可以指向空间被释放的内存地址(悬空指针),而引用则总是指向有效的对象,避免了悬空引用的情况。

        总的来说,指针更加灵活,但使用引用可以在代码中更加清晰和直观地表达意图。在选择使用指针还是引用时,需要考虑代码的需求和设计,以及安全性和效率等因素。

        欢迎大家点赞+评论。

 

标签:const,常量,对象,C++,引用,我们,指针
From: https://blog.csdn.net/2305_81151565/article/details/140378886

相关文章

  • #第3课C++的变量与输入(cin)
    上一节课我们学习了输出(cout),这节课我们将要学习变量与输入,而这些都需要搭配昨天的输出来写,所以昨天的课很重要,不太扎实的同学请看上一讲。在学习今天的课之前我们先来认识几个变量类型:  具体类型字节长度取值范围   int4字节(32位)       -2147483648......
  • c++参数包展开和折叠表达式
    template<typenameT>voidfun2(Tt){cout<<t<<endl;}//利用逗号表达式和初始化列表展开template<typename...Arg6>voidfun1(Arg6...args){intarr[]={(fun2(args),0)...};}template<typenameT>intfunc3Imp(T&&t......
  • 在C++中使用gRPC框架
    概览在gRPC里客户端应用可以像调用本地对象一样直接调用另一台不同机器上的服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多RPC系统类似,gRPC也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包括参数和返回类型)。在服务器端实现这个接口,并运行一个gRPC......
  • C/C++ 避免空指针解引用的方法
    在C/C++中,空指针解引用是一个常见的问题,它会导致程序崩溃或未定义行为。为了避免这种情况,可以采取以下几种方法来确保指针在使用前是有效的:1.初始化指针确保所有指针在使用前都被初始化。未初始化的指针可能包含任意值,尝试解引用这样的指针是危险的。int*ptr=nullptr;......
  • 【C++11新特性】在定义静态成员变量的同时进行初始化
    //test.hclasstest{public:test()=delete;~test()=delete;private:staticconstexprlonglongPOLY_64_REV=0x95AC9329AC4BC9B5L;staticconstexprintBITS_PER_BYTE=8;staticconstexprintCRC_TABLE_LENGTH=256;staticlon......
  • 【C++修行之道】string类的使用
    目录一.C语言中的字符串二、标准库中的string类(了解)2.1string类(了解)2.2帮助文档阅读三、string类的常用接口说明3.1 string类对象的常见构造 3.2 string类对象的容量操作3.3 string类对象的访问及遍历操作字符串类的简单实现3.4 string类对象的修改操作......
  • 2024年华为OD机试真题-传递悄悄话-C++-OD统一考试(C卷D卷)
    2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述:给定一个二叉树,每个节点上站着一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二叉树所有节点上的人都接收到悄......
  • C++ 多态
    1.多态的概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。2.多态的定义及实现2.1 虚函数虚函数:即被virtu......
  • WPF中引用不到相对路径图片?
    在wpf中使用相对路径运行项目时却不显示图片怎么解决?新建img文件夹添加所需要的图片选中图片右键属性设置属性重新生成即可运行效果转载请标明出处!......
  • How to ues Dev C++
    对于Dev-C++这个"老古董",合理利用设置去提升它的能力,是非常important重要的。1.打开全警告方式:工具[T]->编译选项[C]->代码生成/优化->代码警告->第二个和第三个选Yes代码里,总是会出现奇奇怪怪的错误(scanf、printf占位符和参数列表不匹配,if里把==打成=,运算符优先级.........