C++ 学习笔记之 引用

一.定义:

  引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样.

二.用法:

      1. 基本用法

        例如: int & a = b;

      2. 引用作为函数返回值

        先看一个例子:

        #include <iostream>
        using namespace std;
        int temp ;
        int & F(){
            temp*=2;
            return temp;
        }
        int  F1(){
            temp*=2;
            return temp;
        }
        int main(){
            temp = 5;
            int &d = F();
            int e = F();
            int f = F();
            cout << &d << " " << &temp << endl;
            cout << &e << " " << &temp << endl;
            cout << &f << " " << &temp << endl;
            cout << d << " " << temp << endl;
            
            return 0;
        }

        程序输出结果为:

        0x40d020 0x40d020
        0x61ff18 0x40d020
        0x61ff14 0x40d020
        40 40

          从结果中可以看到,当使用引用作为程序返回值并且将这个返回值赋值给引用类型时,他们的地址是相同的(都指向temp这个变量),其他情况都产生了值的赋值,发生了地址的变化。由此也可以看出,使用引用可以减少值的复制,特别是当需要传的数据特别大的时候。

      3. 常引用基本用法如下:
        int b = 4;
        const int a = b;

        使用常引用可以是引用的值不可修改。这样可以防止因误操作引发的数据修改,保证了安全性。

      4. 引用函数作为左值

        一般非引用函数都是只能作为右值,函数一旦计算完成那么它就是一个确定的常数。但引用函数不同。它既可作为左值,又可作为右值。

        int &d = ++F();

         

        相当于

        int A[10];
        int &array = A;

         

        这是它作为左值的应用。

        但当我执行

        int &d = F()++;

        这样会产生错误。错误信息为:

        error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'

        这个错误信息与执行

        int &d = 5;

        的错误信息一致,说明F()++操作实际上是相当于先把F()的值存到一个整型常量中,然后F()(相当于temp)的值加一.一个整型常量无法复制给int&类型。

        执行

        const int &d = F()++;(使用常引用)

         

        int d = F()++;(把常量值拷贝到变量中)

        才可以正常编译。

         

三.注意事项:

        • 引用不能用于数组,但可以用在指针上

          如果尝试执行

          int A[10];
          int &array = A;

           

          编译器会报错:
          error: declaration of 'd' as array of references

          但我可以对指针用引用:

          int *p = A;
          int &array = p;

           

          编译成功。

          至于为什么不能对数组用引用,网上答案很多,我自己不能确定哪种答案是正确的,大家可以自行搜索相关问题。

        • 不要试图返回临时对象的引用,这样引用会成为无效引用,假如把返回值赋值给变量,那么程序可能会崩掉
        • 返回函数内部new分配的内存的引用或指针,这样的写法不推荐,很容易会造成内存泄漏(即无法正常的回收这块内存)
        • 注意常引用与普通引用之间的相互赋值问题
          1 temp = 5;
          2 const int t = 6;
          3 int &d = temp;
          4 const int &e = temp;
          5 const int &f = t;
          6 int &g = t;//编译错误

          常量变量都可以赋值给常引用,但只有变量值才可以给普通引用,若常量值给普通引用会发生编译错误。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值