1 引用
1.1引用概述
在C++中提出佐治引用的概念。如果不加特殊声明,一般认为引用指的都是左值引用。引用实际上是一种隐式指针,它为对象建立一个别名,通过操作符&来实现,引用的形式如下:
数据类型 &表达式
例如:
int a=10;
int & ia=a;
ia=2;
定义了一个引用变量ia,它是变量a的别名,对ia的操作与对a的操作完全一样。ia=2把2赋值给a,&ia返回a的地址。执行ia和执行a=2等价。
使用引用的说明:
- 一个C++引用被初始化后,无法使用它在去引用另一个对象,它不能被重新约束。
- 引用变量只是其他对象的别名,对它操作与原来对象的操作具有相同的作用。
- 指针变量与引用有两点主要区别:一是指针式一种数据类型,而引用不是,指针可以转换为它所指向变量的数据类型,不能进行数据类型转化,以便赋值运算符两边的类型相匹配;而在使用引用时,系统要求引用和变量的数据类型必须相同,不能进行数据类型转换。二是指针变量和引用变量都用来指向其他变量,但指针变量使用的语法要复杂一些;而在定义了引用变量后,其他使用方法与普通变量相同。
int a;
int *pa=&a;
int &ia=a;
4.引用应该初始化,否则会报错。
int a;
int b;
int &a;
编译器会报出“references must be initialized”这样的错误,造成编译不能通过。
1.2 右值引用
右值引用时C++11新增加的一个非常量的引用类型。它的形式为:
类型 && i = 被引用的对象
右值引用可以理解为右值的引用,当右值引用初始化后,临时变量消失。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
int get()
{
int i = 4;
return i;
}
int main()
{
int&& k = get() + 4;
k++;
cout << "k的值为:" << k << endl;
system("pause");
return 0;
}
右值引用只可初始化于右值,但右值引用实际上是一个左值,它具有临时变量的数据类型。
右值引用与左值引用的相同之处:
- 一个右值引用被初始化后,无法使用它再去引用另一个对象,它不能被重新约束。
- 右值引用初始化后,具有该类型数据的所有操作。
2. 函数与引用
2.1 使用引用传递参数
在C++中,函数参数的传递有两种,分别是值传递和引用传递。所谓值传递,是指在函数调用时,将实际参数的值复制一份传递到调用函数中,这样如果在调用函数中修改了参数的值,也不会影响实际参数的值。而引用传递恰恰相反,如果函数按引用方式传递,在调用函数中修改了参数的值,其改变会影响到到实际参数。
2.2 指针和引用
引用传递参数与指针传递参数能达到相同的目的。如果使用指针的引用,就可达到在函数体内改变指针地址的目的。
2.3 右值引用传递参数
使用字面值,如1、3.15f、true,或者表达式等作为临时变量作为函数实参传递时,按左值引用传递参数都会被编译器组织。而进行值传递时,将会产生一个和参数同等大小的副本。C++通过右值引用传递参数,不会申请局部变量,也不会产生参数副本。