C++——引用 – 作者:Johnson666

引用的介绍

在C++11标准中提出了左值引用的概念,如果不加特殊声明,一般认为引用指的都是左值引用。
引用实际上是一种隐式指针,它为对象建立一个别名,通过操作符&来实现。&是取地址操作符,通过它可以获得地址。
引用的形式如下:
数据类型 & 表达式;
例如:

int a=10;
int & ra=a;
ra=2;

定义了一个引用变量ra,它是变量a的别名。对ra的操作与对a的操作完全一样。ra=2把2赋给了a,&ra返回a的地址。执行ra=2和a=2等价。

使用引用的说明:
(1)一个C++引用被初始化后,无法使用它再去引用另一个对象,它不能被重新约束。
(2)引用变量只是其他对象的别名,对它的操作与原来对象的操作具有相同作用。
(3)指针变量与引用有两点主要区别:
1.指针是一种数据类型,而引用并不是数据类型,指针可以转换为它所指向变量的数据类型,以便赋值运算符两边的类型相匹配;而在使用引用时,系统要求引用和变量的数据类型必须相同,不能进行数据类型转换。
2.指针变量和引用变量都用来指向其他变量,但指针变量使用的语法要复杂一些;而在定义了引用变量后,其使用方法与普通变量相同。
例如:

int a;
int *pa=&a;
int &ra=a;

(4)引用应该初始化,否则会报错。
例如:

int a;
int b;
int &a;

编译器会报出references must be initialized这样的错误,造成编译不能通过。
下面通过实例使大家能够更好地了解引用的使用,实现输出引用的功能。

例子:
输出引用:

#include<iostream>

using namespace std;

int main()
{
	int a;
	int &ra = a;
	a = 100;
	cout << "a=" << a << endl;
	cout << "ra=" << ra << endl;
	a = 2;
	cout << "a=" << a << endl;
	cout << "ra=" << ra << endl;
	int b = 20;
	ra = b;
	cout << "a=" << a << endl;
	cout << "ra=" << ra << endl;
	ra--;
	cout << "a=" << a << endl;
	cout << "ra=" << ra << endl;
	return 0;
}

程序声明了变量a和一个对变量a的引用ra,通过不断地改变变量a的引用ra的值使大家了解了引用的使用,然后将改变的结果输出出来。
结果:image.png

右值引用是C++11标准中新增加的一个非常量的引用类型,它的形式如下:
类型 && i=被引用的对象;
左值与右值的区别在于,右值是临时变量,例如函数的返回值,并且无法被改变。例如:

#include"stdafx.h"
#include<iostream>

int get()
{
	int i = 4;
	return i;
}

int main()
{
	int k = 3;
	//int a = ++(get());  //编译出错
	//int a = ++(get() + k);  //编译出错
	return 0;
}

那么什么是右值引用呢》右值引用可以理解为右值的引用,当右值引用初始化后,临时变量消失。

例子:
右值引用的定义:

#include"stdafx.h"
#include<iostream>

int get()
{
	int i = 4;
	return i;
}

int main()
{
	int &&k = get() + 4;  //int &i = get() + 4;  //出错
	k++;
	std::cout << "k=" << k << std::endl;
	return 0;
}

结果:

k=9

右值引用只可以初始化于右值,但右值引用实质上是一个左值,它具有临时变量的数据类型。
与左值引用相同的是:
1.一个右值引用被初始化后,无法使用它再去引用另一个对象,它不能被重新约束。
2.右值引用初始化后,具有该类型数据的所以操作。

来源:freebuf.com 2021-06-16 14:46:49 by: Johnson666

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论