当前位置:   article > 正文

【C++入门】引用符&详解_c++ &

c++ &

1、C++的&引用符介绍

(1)&符号在C语言中表示取地址运算;
(2)C++对&符号进行拓展,&符号新增了引用的用法;
(3)声明引用时,必须同时对其进行初始化
(4)引用声明完毕后,相当于目标变量有两个名称,引用名就相当于变量的别名,操作引号名就相当于操作变量本身;

2、引用和指针的对比

(1)指针在C和C++中都有,且使用方法和实现本质完全相同;但是引用只有C++才有;
(2)引用的定义和识别的关键符号是&,注意和指针取地址的含义进行区分;
(3)引用可以理解成功能弱化、安全性增、受限的指针;
(4)引用型变量在定义时必须初始化,而指针变量可以不初始化;
(5)引用型变量初始化后就不能再修改,而指针变量可以;
(6)引用主要用在函数传参和返回值;

3、&引用符实战

3.1、示例代码

#include <iostream>

using namespace std;

//C语言用指针实现两个int型数的交换
void swap1(int *pa, int *pb)
{
	int tmp;
	tmp = *pa;
	*pa = *pb;
	*pb = tmp;
	
}

//C++用引用符&实现两个int型数的交换
//传入的是变量名的引用名,操作引用名就相当于操作变量本身
void swap2(int &ra, int &rb)
{
	int tmp;
	tmp = ra;
	ra = rb;
	rb = tmp;
	
}

int main()
{
	int a = 1, b = 2;
	int c = 3, d = 4;
	
	//传入变量的指针
	swap1(&a, &b);
	
	//直接传变量名,相当于是传的引用名
	swap2(c, d);
	
	
	cout<< "a=" << a <<";"<< "b=" << b << endl;	
	cout<<"c=" << c <<";"<< "d=" << d << endl;	
	
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

3.2、代码分析

//程序输出结果
[root#]$ a=2;b=1
[root#]$ c=4;d=3
  • 1
  • 2
  • 3

(1)上面的代码用指针和引用两种方式,实现了交换两个int型变量数值的函数;
(2)重点关注&符号在指针和引用两种方式是如何使用的;

4、引用的本质分析

4.1、用const修饰引用

int a;
const int &b = a;

//下面的代码在编译的时候会报错
//因为用const去修饰引用就表示引用是只读的,不能修改
void swap2(const int &ra, const int &rb)
{
	int tmp;
	tmp = ra;
	ra = rb;
	rb = tmp;
	
}

//报错信息
In function ‘void swap2(const int&, const int&):
error: assignment of read-only reference ‘ra’
error: assignment of read-only reference ‘rb’

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

(1)b是变量a的引用名,const修饰后,无法通过b来修改a;
(2)const修饰引用主要是用在函数传参中,当传入的引用只需要读而不需要改时,就可以用const去修饰引用,防止函数中误操作去进行修改,这个C语言的函数用const去修饰传参的思路是一样的;

4.2、引用和sizeof运算符

4.2.1、示例代码

#include <iostream>

using namespace std;

int main()
{
	int a = 1;
	char b;
	long long c;
	
	int &ra = a;
	char &rb = b;
	long long &rc = c;
	cout << "sizeof(ra)=" << sizeof(ra)<<endl;
	cout << "sizeof(rb)=" << sizeof(rb)<<endl;
	cout << "sizeof(rc)=" << sizeof(rc)<<endl;
	
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

4.2.2、结果分析

[root#]$ ./a.out 
sizeof(ra)=4
sizeof(rb)=1
sizeof(rc)=8
  • 1
  • 2
  • 3
  • 4

(1)sizeof得到的不是引用本身的大小,而是引用指向的目标变量的大小;
(2)可以这样理解,引用名就是一个别名而已,本身没有大小,对引用名做sizeof操作,就是对引用指向的变量做sizeof操作;
(3)sizeof操作体现了指针和引用的区别,对指针变量做sizeof操作,得到的确定的字节,4字节(32位操作系统)或者8字节(64位操作系统);

4.3、引用的本质是const指针

(1)int &b = a; 类似于 int * const b = &a;
(2)C++标准并没有规定引用是否占用内存空间,但是大多数编译器都把引用实现为const指针,所以大部分编译器中引用也是要占内存空间的;
(3)引用是天然const的,所以定义时必须初始化指向变量,否则就没意义了;
(4)引用本质是指针,是地址,所以才能实现传址调用的效果;
总结:功能上来说,引用是受限制的指针,相当于用const修饰的指针变量类型;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/1015249
推荐阅读
相关标签
  

闽ICP备14008679号