一、引用
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。
引用的声明方法:类型标识符 &引用名=目标变量名;
eg:int a;
int &b=a; //定义引用b,它是变量a的引用,即别名
说明:
(1)&在此不是求地址运算,而是起标识作用。
(2)类型标识符是指目标变量的类型。
(3)声明引用时,必须同时对其进行初始化。
(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
(5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。
(6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。
指针和引用的区别:
(1)引用必须在创建时进行初始化,指针可以随时进行初始化
(2)一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
二、引用的用法
1、基本数据类型的引用
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
//基本数据类型的引用
int a = 10;
int &b = a;//b是a的别名 //引用必须初始化
b = 20;
cout<<a<<endl;//20 说明对b这个别名的任何赋值都直接影响到a
a = 30;
cout<<b<<endl;//30 对本体的直接赋值,也会影响到别名
return 0;
}
运行结果:
b是a的别名,对别名进行赋值,也会影响到本体;对本体进行赋值,也会影响到别名
2、结构体类型的引用
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct//结构体的引用
{
int x;
int y;
}Coord;
int main()
{
//结构体的引用
Coord c;
Coord &c1 = c;//c1是结构体c的别名
c1.x = 10;
c1.y = 20;
cout<<c.x<<","<<c.y<<endl;
return 0;
}
运行结果:
3、指针类型的引用
类型 *&指针引用名 = 指针;
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
int a = 3;
int *p = &a;//指针p指向a
int *&q = p;//*q是指针p的别名
*q = 5;
cout<<a<<endl;//5
return 0;
}
运行结果:
4、引用作函数参数
#include<iostream>
#include<stdlib.h>
using namespace std;
void fun(int&a,int &b);
int main()
{
//函数参数使用引用
int x = 10;
int y = 20;
cout<<x<<","<<y<<endl;
fun(x,y);
cout<<x<<","<<y<<endl;
return 0;
}
void fun(int&a,int &b)
{
int c = 0;
c = a;
a = b;
b = c;
}
运行结果:
三、总结
(1)在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题。
(2)用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证了引用传递的安全性。
(3)引用与指针的区别是,指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。
(4)使用引用的时机。流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。
补充:
引用和多态
引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。
class A;
class B:public A{……};
B b;
A &Ref = b; // 用派生类对象初始化基类对象的引用
Ref 只能用来访问派生类对象中从基类继承下来的成员,是基类引用指向派生类。如果A类中定义有虚函数,并且在B类中重写了这个虚函数,就可以通过Ref产生多态效果。
部分参考:https://blog.youkuaiyun.com/tingzhiyi/article/details/75321112