《C++避坑神器·二》引用的本质分析

简介: 《C++避坑神器·二》引用的本质分析


概要

` 引用的本质分析

技术细节

关于引用:

(1)申明引用的同时必须要初始化

(2)引用变量是目标变量的一个别名,相当于目标变量,只是名字不同

(3)申明一个引用不是定义了新的变量,只是目标变量的一个别名,引用本身不是一种数据类型,因此不占存储单元,系统也不会给引用分配存储单元

(4)对引用求地址,就是对目标变量求地址

(5)在被调函数中交换主调函数的两个值,常用方法传递变量地址,第二种就是传递引用

(6)引用一旦初始化就不可以更改

int i = 10;
int &b = i;  //现在b就是变量i的别名
int j = 100;
b = j;  //并没有把b转变为变量j的别名,这里相当于把100赋值给b,又因为b是变量i的别名,也就相当于把100赋值给i`

(7)引用可以作为函数返回值

int &f()
{
  static int i = 10; //静态局部变量,在全局区,静态变量等到整个程序运行结束后才会释放
  return i;
}
main()
{
  int &p = f(); //返回的静态变量要等到整个程序运行结束才释放
  cout << p << endl; //10
}

(8)如果函数的返回值是引用,这个函数可以作为左值

int &f()
{
  static int i = 10;
  return i; 
} 
main()
{ 
  int &p = f(); //函数返回引用给p,此时引用p是变量i的一个别名
  f() = 100; //函数返回变量i值,这时变量i又被赋值100,又因为上面p是变量i的别名,等于p被赋值100
  cout << p << endl; //100 
}

引出引用的本质:

引用的本质是指针常量,地址不可变,值可变

int a = 10;
int &b = a;  //实际是int * const b = &a;
b = 20;  //实际是*b = 20

延申:常量引用本质就是常量指针常量

int i = 10;
int &p = i; //给引用赋的是变量,如果int &p = 10; 直接赋常量报错
const int &p = 10; //常量引用可以直接赋值,编译器做了一个默认操作,int tmp = 10;然后const int &p = tmp;  而且常量引用值是不可以修改的,因为常量引用本质是常量指针常量,const int * const p = &tmp;

小结

引用的本质是指针常量,地址不可变,值可变

相关文章
|
1月前
|
存储 安全 C++
在C++指针和引用
在C++指针和引用
|
1月前
|
C++
如何在C++中实现cpp文件中引用另外一个cpp文件
如何在C++中实现cpp文件中引用另外一个cpp文件
|
1月前
|
存储 程序员 C++
C++的指针和引用
C++的指针和引用
|
1月前
|
程序员 C语言 C++
C++入门(头文件,命名空间,作用域,输入输出流,引用,缺省参数,函数重载)
C++入门(头文件,命名空间,作用域,输入输出流,引用,缺省参数,函数重载)
|
1月前
|
存储 Java 编译器
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
104 0
|
1月前
|
存储 JSON 安全
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
66 0
|
1月前
|
算法 安全 大数据
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析(二)
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析
48 0
|
1月前
|
设计模式 算法 数据安全/隐私保护
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
25 0
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
|
1月前
|
存储 算法 编译器
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(一)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
42 0
|
1月前
|
监控 安全 算法
悬垂引用与临时对象在C++中的深入探讨: 风险、原因与预防策略
悬垂引用与临时对象在C++中的深入探讨: 风险、原因与预防策略
56 3