目录引用引用的特性引用的使用const 引用权限缩小合法权限放大非法引用引用不是新定义一个变量而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空间它和它引用的变量共用同一块内存空间。类型 引用别名引用对象;// C 标准对 main() 函数有特殊规定main() 函数是唯一允许不写 return 语句的函数。引用的特性引用在定义时必须初始化。一个变量可以有多个引用。引用一旦引用一个实体就不能再引用其他实体。//引用的功能 //1.做函数的形参修改形参影响实参 using namespace std; void swap(int a, int b) { int tmp a; a b; b tmp; } ////2.做函数形参减少拷贝提高效率 struct A { int a[100]; int b; // //... }; // void func(struct A* aa) {} //// 引用功能2做函数形参减少拷贝提高效率 void func(struct A aa) {} int main() { int x 1, y 2; cout x y endl; swap(x, y); cout x y endl; struct A a; // //类型struct A 函数名为a func(a); func(a); return 0; }引用的使用引用在实践中主要用于引用传参和引用做返回值中以减少拷贝、提高效率并在改变引用对象时同时改变被引用对象。引用传参与指针传参功能类似但引用传参相对更方便一些。引用返回值的场景相对比较复杂我们在这里简单介绍了一下场景还有一些内容在后续类和对象章节中会继续深入讲解。引用和指针在实践中相辅相成功能有重叠性但是各有特点互相不可替代。C 的引用与其他语言的引用如 Java有很大区别除了用法最大的区别是 C 引用定义后不能改变指向而 Java 的引用可以改变指向。一些主要用 C 代码实现的数据结构教材中使用 C 引用替代指针传参目的是简化程序避开复杂的指针但是很多同学没学过引用导致一头雾水。int func() { int ret; return ret; } ////返回的是拷贝的临时变量 int SLAT(SL ps, int i) { assert(i ps.size); return ps.arr[i]; } ////传引用返回 返回的是别名 并没有创建临时对象 可以对其进行修改const 引用可以引用一个 const 对象但是必须用 const 引用。const 引用也可以引用普通对象因为对象的访问权限在引用过程中可以缩小但是不能放大。引用权限只能缩小、不能放大权限缩小合法普通对象可以绑定const 引用int a 10; const int ra a; // 合法原对象a可读、可修改ra只能读不能改相当于访问权限收窄C 允许。权限放大非法const对象不能绑定普通非const引用const int a 10; int ra a; // 编译报错原对象a只读ra允许读写权限变大破坏常量的不可修改特性直接禁止。需要注意的是类似int rb a*3;或double d 12.34; int rd d;这样的场景中a*3的结果保存在一个临时对象中int rd d也是类似在类型转换中会产生临时对象存储中间值。也就是说rb和rd引用的都是临时对象而 C 规定临时对象具有常性所以这里就触发了权限放大必须用常引用才可以。临时对象的特殊性自带常性临时对象是编译器自动创建、没有名字、生命周期极短的中间变量表达式结果、类型转换中间值C 规定所有临时对象都是 const 性质。所谓临时对象就是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象C 中把这个未命名对象叫做临时对象。表达式运算产生临时int a 2; int rb a * 3; // 报错int main() { int x 0; int r1 x; // // 权限可以缩小 // //r1是x的别名 const int r3 x; // //r3缩小权限 const int y 1; // // 权限不能放大 int r2 y; const int r2 y; // // // 权限有没有放大没有 int z y; // // // 指针和引用才涉及权限缩小和放大 const int* p1 y; // // 权限不能放大 int* p2 p1; const int* p2 p1; int* p3 z; // // 权限可以缩小 const int* p4 p3; // // // // return 0; }这是一些记忆的零碎知识点传值传参调用拷贝构造——后定义的先析构。如果要显式地写析构就要写拷贝构造。