第三章 C++引用

以下是本人整理的C++基础知识点,内容并不包含全面的C++知识,只是对C++重点内容、特点进行整理和归纳。

思维导图链接:https://www.mubucm.com/doc/1ol7DX-MgtS

3.1 C++引用介绍

    函数调用时的值传递
        基本数据类型 
            传递内容,也就是内存拷贝,速度快

        数组
            强制传递数组指针,禁止直接传递数组内容,速度快

        复合数据类型(结构体、类)
            传递内容
                当传递的数据量很大时,会严重影响效率

            传递指针
                速度快

            引用(推荐)
                比指针更加便捷

    C++引用的介绍
        引用可以看做是数据的一个别名,使用方式和原来的命名一致
        类似于电脑文件的快捷方式

    引用的定义
        type &name = data;
        type const  &name = data;  //常引用
        const  type &name = data;  //常引用

    引用的特点
        必须在定义的同时初始化
        初始化后不能更改
        引用名和原来的名字都指代同一个地址上的数据

    引用的使用
        int a = 99;
        int &r = a;

    定义时和使用时&的作用
        定义时:【&r  = a;】表示定义一个引用
        使用时:【p = &r ;】表示获取地址

    C++引用作为函数参数
        void fun(int &r1, int &r2) {...}
        都指代同一份数据
        操作引用就是操作原来的数据
        建议用于代替指针,更方便1

    C++引用作为函数返回值
        int &fun(int &r) {...}
        注意:不能返回局部数据,因为局部数据的内存在函数退出后不能被访问,是非法的!

3.2 C++引用的本质

引用的本质
    引用只是对指针进行了简单的封装,底层依然通过指针实现
    引用占用的内存和指针占用的内存长度一样
    不能获取引用的地址,是因为编译器进行了内部转换
    引用比指针更加易用

引用和指针的区别
    引用
        引用必须在定义时初始化,且初始化后不能改变
        有常引用,但没有 const 引用:int & const r = a; //错误的
            引用本来就不能改变指向,没必要const

        引用只能有一级,没有多级
        引用的++、--是对数据本身加减

    指针
        指针在定义时不必赋值,以后也能指向任意数据
        指针有常指针
        指针可以有多级指针
        指针的++、--是对指针地址加减

3.3 C++引用不能绑定到临时数据

引用和指针的指向
    只能指向内存(可寻址)
    不能指向寄存器或者硬盘(不可寻址)

临时数据的存放
    哪些是临时数据
        表达式的结果、函数的返回值

    临时数据存放在哪里
        可能放在内存中,也可能放在寄存器中
        例子
            int func(){  int n = 100;   return n;  }
            bool *p4 = &(m < n);
            函数返回值和表达式结果存放在寄存器中,无法用&获取地址


    运行时,哪些临时数据会放到寄存器中
        基本数据类型的临时数据,通常放到寄存器中,加快CPU存取,不可以用&获取内存
        复合数据类型的临时数据,数据大小不定,通常放到内存中,可以用&获取内存


常量表达式的值的存放
    在编译阶段求值
    编译阶段:不单独分配内存,而是和代码合并到一起,放到虚拟地址空间中的代码区
    汇编角度:是一个立即数,会被“硬编码”到指令中,不能寻址,所以不可以用&获取内存

引用不能指代临时数据
    引用和指针在本质上是一样的
    引用作为函数参数时,注意不能传递临时数据

3.4 编译器为const引用创建临时变量

const引用:【bool isOdd(const int &n){ ... }】
将常引用绑定到临时数据时的编译器动作
    编译器会新建一个无名的临时变量,将临时数据放入该临时变量中
        传入的是临时数据才会创建

    然后将常引用绑定到该临时变量

3.5 C++ 引用与转换类型

指针和普通引用
    指针和普通引用指向的类型必须严格一致,禁止指向不同类型的数据

常引用
    常引用可以绑定到类型相近的数据
    
    引用和相近类型数据的赋值过程
        编译器创建一个临时变量(和引用类型一致)
        将数据赋值给这个临时变量,赋值过程发生自动类型转换
        再将引用绑定到这个临时的变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值