- 指针和变量:两者有各自的存储空间,指针也是一个变量
- 引用和变量:两者为同一存储单元,引用没有“额外”分配存储空间。
- 引用在声明时必须初始化,否则会产生编译错误
- 可以有指针变量的引用,但不能有指向引用的指针
- 不能建立引用数组,但可以建立数组或数组元素的引用
int (&ra)[10] = a; //正确:ra是具有10个元素的整型数组的引用 int *(&rpa)[10] = b; //正确:rpa是具有10个整型指针的数组的引用 //从取别名角度去思考这个问题,引用不设计空间分配
- 引用的引用不存在(因为 T& 不是类型), 即不能建立多重引用
- 左值:是指变量对应的那块区域的地址, 是可以放在赋值符号左边的值;右值:是指变量对应的内存区域中存储的数据值, 是可以放在赋值符号右边的值
- 左值引用和右值引用
左值引用只能绑定变量名,而且具有持久性; 类型 &引用名 = 变量名; 右值引用只能绑定到常量或表达式求值过程中创建的临时变量上,可延长临时变量的生存周期;右值引用是C++11为了支持移动操作而引入的新型引用类 型,只能绑定到即将销毁的对象上,如常量和表达式 类型 &&引用名 = 表达式;
- 定义引用时,用const修饰的引用称为 常量引用。相对而言,没有const修饰的引用称为 普通引用
const 类型 &引用名 = 变量名;
- 非const引用(普通引用)不可以用 “常量” 或 “运算符 & 表达式的运算结果”进行引用初始化,但const引用却可以
- constexpr常量必须在编译时进行初始化,而const常量的初始化可以延迟到运行时;
- constexpr常量的表达式中的每一部分值都是在程序运行前就可以确定的字面值常量;const常量无此限定,只限定了在运行期间不可修改
const int n = size(); //正确 constexpr int n = size(); //错误 int j = 21; const int i=10; const int j1=i+10; //正确 const int j1=j+10; //正确 constexpr int j1=i+10; //正确 constexpr int j1=j+10; //错误
-
函数参数传递的三种方式:值传递、地址传递、引用传递值传递:传递的是参数值的拷贝(副本),而不是参数本身 地址传递||引用传递:函数要改变调用它的函数的变量(实参) 大型数据对象 按引用传递,效率非常高
- 此外,指针允许传递空对象,但引用必须传递有效对象
- 用 const 限制函数的参数: 能够保证函数不对参数做任何修改
- 当一个函数返回引用时, 实际返回了一个变量的内存地址
Ø既然是内存地址,就能够读和写该地址所对应的内存区域中的值,这使得:函数调用能够出现在赋值语句的左边; Ø函数返回的引用:不是返回变量的副本;
- 不可返回函数内部的临时(局部)变量
int & fn(int &num){ return (num); }
早上先看到这里,去玩其他事情了