引用的介绍
在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的值使大家了解了引用的使用,然后将改变的结果输出出来。
结果:
右值引用是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
请登录后发表评论
注册