c++引用详解

c++引用详解,第1张

引用是c++中一个非常重要的概念,话不多说,我为大家讲讲引用的概念及其它的一些特性。

引用的概念:

引用是给别的已经存在的变量取得别名。它不单独开辟空间,它和引用的变量共同用同一块地址。

类型& 引用变量名(对象名) = 引用实体;

 注意:1.引用类型必须和引用实体同种类型的。

             2.引用变量和引用实体地址是相同的。

引用的特性:

1.引用在定义时必须被初始化。(和指针不同,指针可以不被初始化)

2.一个变量可以多次被引用。

 3.引用一旦引用了一个实体,再也不能引用其他实体。

 常引用:

取别名的时候有一个规则:取完后的别名的权力<=实体的权力。列如:

 这种方式取别名就是错误的。a这个实体的权力原本只能读,不能写(值不能被修改)。而a的引用——ra变成了可读可写,使a原本的权力被放大了,所以引用最终是失败的,应该做以下修改:

const int& ra = a;

那么以下情况可以编译成功呢?

 double d = 12.34;
 //int& rd = d; // 该语句编译时会出错,类型不同
 const int& rd = d;

在解释这种情况之前,我为大家解释解释什么是临时变量

double a =1.23;
int b = a;

我们先思考,变量a是如何存储到b里面去的呢?那是因为a占据8个字节的变量将整数部分放到临时变量里,再放到变量g里。

 那么返回之前的那个问题为什么加了const就行了呢,因为单有int& 只是一种类型的转化,double转换到int会存在临时变量,临时变量具有常属性。

引用的妙用:

1.做函数的参数:

void Swap(int& left, int& right) {
   int temp = left;
   left = right;
   right = temp; }

之前我们写数据交换的函数都需要把指针作为形参,现在直接可以用引用,因为引用指向了实体的空间,它们公用同一块空间。

2.做函数的返回值:

传值、传引用效率比较:

如果是传值,实参传给形参,形参是实参的一份临时拷贝。如果函数调用多次,临时拷贝就会出现占用内存和效率低下的问题。如果是传引用,引用就可以直接找到本体将进行相关代码 *** 作,不需要进行临时拷贝,提高程序的效率。

值和引用的作为返回值类型的性能比较:

引用作为返回值的前提是要使用正确!!列如以下代码:

int& Add(int a, int b) {
    int c = a + b;
    return c; }
int main()
{
    int& ret = Add(1, 2);
    Add(3, 4);
    cout << "Add(1, 2) is :"<< ret <

大家仔细思考一下,这个代码的结果是什么?答案是7,这是为什么呢?

变量c是在栈帧中创建的一个变量,当函数调用结束后栈帧将会被销毁。Add函数传回的是c的引用,当ret想找到c那块空间时发现那块空间的使用权已经不属于我们了。

 

注意: 如果函数返回时,出了函数作用域,如果返回对象还在 ( 还没还给系统 ) ,则可以使用 引用返回,如果已经还给系统了,则必须使用传值返回。  值和引用作为返回值性能的差异在于值作为返回值的时候会进行临时拷贝,函数调用次数过多就会造成效率的低下。总体而言使用引用的效率更高。 引用和指针的区别:

1.引用不占据空间,指针占据空间。

2.引用的底层是用指针实现的。

引用和指针的不同点 : 1. 引用概念上定义一个变量的别名,指针存储一个变量地址。 2. 引用 在定义时 必须初始化 ,指针没有要求 3. 引用 在初始化时引用一个实体后,就 不能再引用其他实体 ,而指针可以在任何时候指向任何 一个同类型实体 4. 没有 NULL 引用 ,但有 NULL 指针 5. sizeof 中含义不同 引用 结果为 引用类型的大小 ,但 指针 始终是 地址空间所占字节个数 (32 位平台下占 4 个字节 ) 6. 引用自加即引用的实体增加 1 ,指针自加即指针向后偏移一个类型的大小 7. 有多级指针,但是没有多级引用 8. 访问实体方式不同, 指针需要显式解引用,引用编译器自己处理 9. 引用比指针使用起来相对更安全

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/2991542.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)