引用定义:
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦
把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
语法
数据类型& 变量名 = 目标对象;
注意事项:
1.引用必须直接初始化 形参列表引用没有直接初始化(在函数调用时初始化)
**声明引用的同时必须对其初始化,否则系统会报错**
2.引用一旦初始化 不能更改引用对象(不能指向其他对象) 从一而终
3.对引用对象的操作,直接影响其目标对象
4.&不是求地址运算符,而是起标志作用
5.引用的类型必须和其所绑定的变量的类型相同
6.引用不是定义一个新的变量或对象,因此内存不会为引用开辟新的空间存储这个引用
int a = 10;
int& r1 = a,r2;
int* p1,p2;
常引用 int& r = 10;//错误 const int&r = 10; //可以的
引用的应用:
(1)函数参数 在函数内部可以直接修改实参的值
(2)函数的返回值 需要确保在函数调用之后,返回的对象依然有效
能够返回全局变量 静态变量 动态内存对象 引用参数的的引用
不能返回局部变量的引用 编译警告 引用的对象的值不确定 行为不确定
如果在编程过程中既希望通过让引用作为函数的参数来提高函数的编程效率,又希望保护传递的参数使其在函数中不被改变,则此时应当使用对常量的引用作为函数的参数。
(3)多态 父类引用类型引用子类对象
关于第二点写一个例子
#include <iostream>
using namespace std;
void swap(int *pa,int *pb){
int tmp = *pa;//pa = &a;
*pa = *pb;
*pb = tmp;
}
//引用
void exchange(int& m,int& n){// m和n是实参a和b的别名 操作m和n 其实 就是操作实参
int tmp = m;
m = n;
n = tmp;
}
int main(){
int a = 1024, b = 9527;
cout << "a=" << a << ",b=" << b << endl;
exchange(a,b);
cout << "a=" << a << ",b=" << b << endl;
int m = 1, n = 2;
exchange(m,n);
cout << m << "," << n << endl;
return 0;
}
引用与指针:
(1)引用的本质就是指针,C++对指针的一个封装 很多场合引用和指针可以互换
(2)C++层面 上引用和指针有以下方面的不同
A.指针是实体变量,但是引用不是实体变量
sizeof(指针) == 4/8 当平台和编译器确定,大小唯一
int a=1; int& ra=a; sizeof(ra)== 4
double d=1.0; double& rd=d; sizeof(rd) ==8
B.指针可以不初始化 但是引用必须初始化
int *p; //OK
int& r; //Error
C.指针可以修改目标(指向不同的目标) 但是引用不能修改引用方向
int *p = &a; //指向a
p = &b; //指向b
int& r = a; //引用b
r = b; //对a进行赋值 &r = b;//
D.可以声明void指针 void* 但不能声明void引用 void&
void* p; //OK
void& r = v;//Error
E.可以定义指针的指针(二级指针) 但不可以定义引用的引用
int **p; //指针的指针
int a; int &r = a;
int&& rra = r; //引用的引用 Error
int& rra = r;
F.可以定义指针的引用 但不可以定义引用的指针
int *p;
int*& rp = p; //指针的引用 本质是引用 引用一个指针
int& *pr; //错误的 引用的指针 本质是指针 指针指向引用
G.可以定义数组的引用 但不能定义引用的数组
//数组的引用 本质是引用,引用了一个数组
int arr[5] = {1,2,3,1023,1024};
int (&rar)[5] = arr; //数组的引用 和 数组的指针 很类似
int a,b,c,d,e;
int& brr[5] = {a,b,c,d,e};// 引用的数组 Error
总结
1.在引用的使用中,单纯给某个变量去别名是毫无意义的,引用的目的主要用于在函数参数的传递中,解决大块数据或对象的传递效率和空间不如意的问题
2.用引用传递函数的参数,能保证参数在传递的过程中不产生副本,从而提高传递效率,同时通过const的使用,还可以保证参数在传递过程中的安全性
3.引用本身是目标变量或对象的别名,对引用的操作本质上就是对目标变量或对象的操作。因此能使用引用时尽量使用引用而非指针