什么是引用
“引用是变量的别名”,如:
int n = 10;
int &m = n;
在这里,m完全等价于n,任何对m的操作都是对n的操作;
引用的特性
- 引用必须初始化
- 引用初始化后就不能修改
- 引用作为函数参数可以替代指针变量
引用的本质
引用的本质在c++内部实现是一个指针常量:
Type& ref = val; // Type* const ref = &val;
c++ 编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同,只是这个过程是编译器内部实现,用户不可见;
引用与指针的区别
- 引用必须被初始化(初始值必须是一个对象),指针不必(但最好要初始化);
- 引用初始化以后不能被改变,指针可以改变所指的对象;
- 不存在指向空值的引用,但是存在指向空值的指针;
- 指针是一个对象,可以定义指向指针的指针。但不能定义指向引用的指针,也不能定义指向引用的引用;
和 C# 中的引用类型的思考
C# 中的引用类型和C++ 的引用区别比较大,不如说C# 引用类型的行为更接近指针,可以改变其指向的对象实例,类似C++ 指针指向一个对象,但有一些明显区别:
- 不能直接操作地址:C#不允许直接操作内存地址或进行指针算术,这与C++的指针不同。在C#中,只能使用引用类型变量来访问对象,而不能像指针那样进行复杂的内存操作;
- 自动垃圾回收:C#有自动垃圾回收机制,会在对象不再被引用时释放内存,而C++需要程序员手动管理内存(使用 delete 释放通过 new 分配的内存);
- 类型安全:C#的引用类型是类型安全的,编译器会在编译期间进行类型检查,而C++指针可以指向任何类型的内存,容易导致类型错误;