C++_引用详解
引用: 引用是对一个变量 或 对象(后期讲解) 取的别名,
当引用初始化为某个变量, 便可以使用该引用名称或变量名称来指向此变量.
1.引用的定义:
定义别名方式:
真名的类型 & 别名 = 真名; // 别名也必须符合命名规则(由数字,字母,下划线组成,且初始字符不能为数字)
int MyVariate = 10; // 初始化变量
int & Var = MyVariate;
// var是MyVariate的别名, 此时便可以使用别名来对变量进行修改
Var = 20;
// 此时MyVariate的值变为20
2.引用的使用:
当引用某个类型的变量之后, 引用的使用与该类型变量的使用相同, 引用可以引用指针类型变量, 结构体类型变量…, 可以给引用的别名引用, 但无实际意义.
3.引用形参:
形参 : 在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。
实参 : 函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。
实参->形参 : 实参与形参之间是单向传递, 发生函数调用时, 实参会把值传给形参, 但形参的改变不影响实参
引用形参 : 引用形参和指针形参一样, 它们都可以改变实参的值
引用形参代码实现:
#include<iostream>
using namespace std;
// 简单交换函数
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int n = 1, m = 2;
swap(m, n);
printf("%d %d", m, n); // 此时n等于2, m等于1
return 0;
}
4. 引用与指针对比:
当引用作为函数参数时, 与指针作为函数参数效果相同, 但引用不会产生指向对象的副本,节省时间和空间
理论来讲: 引用是一个别名,不占用内存(并不确切) 指针是一个变量, 一般占用**4字节(与编译环境也有关)**来存储地址
引用在定义时就被初始化, 引用的对象不能改变, 而指针的指向可以更改, 像const常量指针
引用的变量在定义前必须初始化, 指针不需要, 并且指针还可以指向空地址;
引用是直接访问,指针是间接访问
指针有多级指针, 但引用没有多级引用!
‘&’ 与 ‘*’: (都有三种用法)
* 乘 (双目:左右两边有操作数) 定义指针(左边带类型) 解引用 (单目 : 右边有操作数)
& 位与 (双目: 左右两边有操作数) 定义引用名(左边带类型) 取地址 (单目 : 右边有操作数)
5.别名在内存中如何体现
回到刚刚的问题, 引用是否占用内存
#include<iostream>
using namespace std;
struct xxx {
double& ref;
};
int main()
{
printf("%d\t%d\t%d\n", sizeof(double), sizeof(xxx), sizeof(xxxx));
}
当我们在 VS2019 使用上面的代码测试结果时可以发现别名是占用内存的(4 byte)
个人比较倾向的观点: 引用是一种概念, 抽象的定义, 便于程序员使用, 接口的实现由编译器决定.
但在各种编译器的汇编分析过后, 实现都是占用内存的, 基本都是4字节与指针相同
参考:https://www.cnblogs.com/gxcdream/p/4805612.html
https://www.cnblogs.com/ronny/p/3662556.html