分享免费的编程资源和教程

网站首页 > 技术教程 正文

C++|引用的本质是一个由编译器实现了自动解引用的指针常量

goqiw 2024-10-04 22:07:29 技术教程 23 ℃ 0 评论

1 指针常量的一个实例

#include <iostream>
using namespace std;
void main()
{
	
	int j=3;
	int var=4;							
	int* p = &var;												
	int* const pf = &var;
	*pf=8;
	int i = 5;
	cout<<&j<<endl;
	cout<<&var<<endl;
	cout<<&p<<endl;
	cout<<&pf<<endl;
	cout<<&i<<endl;
 system("pause");
}
/*输出:
0012FF44
0012FF40
0012FF3C
0012FF38
0012FF34
*/

2 上述指针常量写成引用的形式

#include <iostream>
using namespace std;
void main()
{
	
	int j=3;
	int var=4;							
	int* p = &var;												
	int& f = var;
	f=8;
	int i = 5;
	cout<<&j<<endl;
	cout<<&var<<endl;
	cout<<&p<<endl;
	cout<<&f<<endl;
	cout<<&i<<endl;
 system("pause");
}
/*输出
0012FF44
0012FF40
0012FF3C
0012FF40
0012FF34
*/

3 引用的本质是一个指针常量

从以上两个实例可以看出,引用是占用一个指针的内存空间的,但其引用本身的地址被编译器隐藏了,& f是其指向的变量的地址,而f由编译器实现的自动解引用,f自动解引用为其指向的变量的数据值。所以, 引用的本质是一个指针常量,一个由编译器实现了自动解引用的指针常量。

查看上面两个实例对应的汇编代码,发现其完全一致:

凡是使用了引用变量的代码,都可以转换成使用指针常量对应形式的代码,只不过书写形式上要烦琐一些。反过来,由于对引用变量使用方式上的限制,所以使用指针常量实现的功能不一定能够用引用来实现。

函数返回一个引用可以用作左值:

#include <iostream>
using namespace std;
int& g2(void)
{
 static int a = 10;
 a++;
 printf("a:%d \n", a);
 return a; 
}
int main(void)
{
 g2() = 100; //函数返回值是一个引用,当左值。
 g2();
	system("pause");
 return 0;
}
/*
a:11
a:101
*/

也可以写成返回指针的形式,只是写起来繁琐一些:

#include <iostream>
using namespace std;
int* const g2(void)
{
 static int a = 10;
 a++;
 printf("a:%d \n", a);
	int* const p = &a;
 return p; 
}
int main(void)
{
 *(g2()) = 100; //函数返回值是一个引用,当左值。
 g2();
	system("pause");
 return 0;
}
/*
a:11
a:101
*/

4 引用语法引入的理由或合理性

4.1 常量要求初始化,增强了其安全性;

4.2 实现了自动解引用,使用上更简洁;

-End-

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表