前言:
C++的引用,是学习C++的重点之一,它与指针的作用有重叠的部分,但是它绝不是完全取代指针(后面我们也会简单的分析)。
引用的概念:
引用 不是新定义一个变量 ,而 是给已存在变量取了一个别名 ,编译器不会为引用变量开辟内存空间, 它和它引用的变量共用同一块内存空间。
引用的表示方法:
ps:C++中,&既有引用又有取地址的意义。
这里学过C语言的都可能有些困惑,&的作用不是取地址吗?其实这就是C++的运算符重重载的一个特殊例子:
注意:引用类型必须和引用实体是同种类型的 。
引用的特性:
1、引用必须初始化。
2、一个变量可以有多个引用:
3、引用定义后不能改变指向(这个特性极其重要)
常引用:
在C++中,常引用(const reference
)是一个特殊的引用类型,它用于指向一个不可被修改的对象。常引用允许我们传递对象给函数,而无需担心函数会修改传递的对象。
1、定义:
常引用通过在引用类型前添加const
关键字来定义。例如,const int& ref
是一个指向整数的常引用,它不能用于修改所引用的整数。
2、初始化:
常引用必须在定义时立即初始化,并且一旦初始化后就不能再引用另一个对象。
3、使用场景:
函数参数:当我们想要避免传递大型对象的拷贝,并且确保函数不会修改传递的对象时,可以使用常引用作为函数参数。
返回常量对象的引用:当我们想要返回一个常量对象的引用而不是拷贝时,可以使用常引用。这通常用于类的getter函数。
引用的作用:
1、做参数:
1、输出型参数,我们通过改变这个形参,影响外面的实参
2、对象比较大,为了减少消耗,提高效率。
既然指针也能解决的问题,为啥一定要用引用呢?实际上:
2、做返回值
在C++中,函数可以返回引用。这通常用于返回对象的一部分,如数组元素、类的成员等,以便可以修改返回的值。但是,必须小心使用返回引用,因为不正确的使用可能导致悬空引用(dangling references)或未定义的行为。
我们都知道,程序的运行有赖于内存空间中一个个栈的创建与销毁,当指针指向一块已被释放的空间时,这个指针就是野指针,那么引用是否也会有这方面的问题呢?
总结一下,引用做返回值,不能使用局部变量,最好是全局变量或静态变量。也就是说如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。
引用与指针的区别:
前面我们提到,指针与引用的功能是有所重叠的,但是,在C++中,引用是对指针的使用在某些复杂场景进行的某些替换,让代码更易懂,但是绝不是用来替代指针的。
在前面我们提到引用的一个重要特性就是引用是不能改变指向的,这可要了老命了。想想我们学习的数据结构,二叉树、双向链表.......但凡增删查改就需要改变指向。
总结一下,引用与指针的区别:
语法上:1、 引用不是对象,没有自己的内存地址,它只是某个对象的别名。而指针是地址,需要开内存空间。
2、引用必须初始化,指针可以初始化也可以不初始化
3、引用不呢改变指向,指针可以改变指向。