以下是本人整理的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++ 引用与转换类型
指针和普通引用
指针和普通引用指向的类型必须严格一致,禁止指向不同类型的数据
常引用
常引用可以绑定到类型相近的数据
引用和相近类型数据的赋值过程
编译器创建一个临时变量(和引用类型一致)
将数据赋值给这个临时变量,赋值过程发生自动类型转换
再将引用绑定到这个临时的变量