-
-
[分享]C++基础五-引用
-
发表于: 2021-8-24 17:15 3593
-
引用的含义
在C语言中,函数的参数传递本质上是一次赋值的过程,赋值是对内存的拷贝。对于基本类型的数据,占用的内存一般较小,对它们进行内存拷贝非常快速。而对于数组、结构体、类对象等一系列数据的集合,数据的大小没有限制,可能很大,对它们进行频繁的内存拷贝会消耗很多时间和内存资源,降低程序的执行效率。因此C++扩充了引用(reference)的概念,用来更加便捷的传递聚合类型的数据。
引用可以看做是变量的一个别名,通过这个别名和原来的名字都能够找到这份数据。
引用的用法
引用的定义方式类似于指针,用 & 取代 * 。引用必须在定义的同时初始化,并且不能再引用其它数据,这点类似于常量(const 变量)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <iostream> using namespace std; int main() { / / 引用&,给变量取个别名,不能再修改引用的变量对象 int nVal = 9 ; int nTemp = 8 ; int & nRefVal = nVal; nRefVal = 9 ; / / 允许 cout << "val:" << nVal << endl; cout << "refval:" << nRefVal << endl; nRefVal = nTemp; / / 不允许 cout << "val:" << nVal << endl; cout << "refval:" << nRefVal << endl; return 0 ; } |
注意,引用在定义时需要添加&,在使用时不能添加&,使用时添加&表示取地址。由于引用和原始变量都是指向同一地址,所以通过引用也可以修改原始变量的值。
const 引用
使用常量对 const 引用初始化后将生成一个只读变量。
1 2 3 4 5 | int a = 9 ; const int & b = a; int * p = ( int * )&b; b = 5 ; / / 不允许,b是只读变量 * p = 5 ; / / 允许,修改变量a的值 |
当使用常量对 const 引用进行初始化时,C++ 编译器会为常量分配空间,并将引用名作为这段空间的别名。
使用引用传递参数
在定义或声明函数时,我们可以将函数的形参指定为引用的形式,这样在调用函数时就会将实参和形参绑定在一起,让它们都指代同一份数据。如果在函数体中修改了形参的数据,那么实参的数据也会被修改,能够在函数内部影响函数外部数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <iostream> using namespace std; void Swap( int & nNum1, int & nNum2) { int nTemp = nNum1; nNum1 = nNum2; nNum2 = nTemp; } int main() { int nNum1 = 9 ; int nNum2 = 8 ; Swap(nNum1,nNum2); cout << "nNum1:" << nNum1 << endl; cout << "nNum2:" << nNum2 << endl; return 0 ; } |
函数中的引用形参不需要进行初始化,它的初始化发生在函数调用的时候。
引用作为函数返回值
不要返回局部变量的引用,因为当函数调用完成后局部变量就会被销毁,有可能在下次使用时数据就不存在了,C++ 编译器检测到该行为时也会给出警告。
引用和指针的区别
- 不存在空引用,引用必须连接到一块合法的内存。
- 引用必须在创建时被初始化。指针可以在任何时间被初始化。
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
引用旨在大多数的情况下替代指针
- 功能性:可以满足大多数需要使用指针的场合。引用的目的主要是在函数参数传递中解决大数据的传递效率和空间不如意的问题。
- 安全性:可以尽量避开由于指针操作不当带来的内存错误。用引用传递函数参数可以保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证引用传递的安全性。当然,不要返回局部变量的引用。
- 操作性:简单易用,功能强大。
引用的本质
引用在C++中的内部实现是一个指针常量,因此引用所占用的空间大小和指针相同。
github:https://github.com/0I00II000I00I0I0
bilibili:https://space.bilibili.com/284022506
赞赏
他的文章
- [分享]C++基础十七-异常机制 8580
- [分享]C++基础十六-模板 8941
- [分享]C++基础十五-运算符重载 8964
- [分享]C++基础十四-抽象类 8677
- [分享]C++基础十三-多态 8477
看原图
赞赏
雪币:
留言: