- 1.6 引用
1.6 引用
C++出现了新的概念:引用。引用是某个变量的别名。
语法格式如下:
类型 &引用名 = 变量名;
#include <iostream>
using namespace std;int main (void) {int num = 8;int &nr = num;cout << "num = " << num << endl;//num = 8cout << "nr = " << nr << endl;//nr = 8cout << "num的地址: " << &num << endl; //num的地址: 0xbfcdf738cout << "nr的地址: " << &nr << endl;//nr的地址: 0xbfcdf738return 0;
}
例子当中可以看出来 num 和 nr 其实是同一块内存。
用途:
1)简化编程,用指针的场景可以用引用替换(尽量减少指针的使用)
#include <iostream>
using namespace std;void swap(int *p1, int *p2) { //交换函数int temp = *p1;*p1 = *p2;*p2 = temp;
}struct stu { //结构体char name[20];int age;int score;
};namespace func1{ //名字空间 void func(struct stu s1) {cout << "fun1 : " << &s1 << endl;}
}namespace func2 { //名字空间void func(struct stu &s1) {cout << "fun2 : " << &s1 << endl;}
}int main (void) {int x = 100;int y = 200;swap(&x, &y);cout << "x : " << x << "\t" << "y : " << y << endl;stu s1;cout << "struct stu : " << &s1 << endl;func1::func(s1);//这样调用会导致创建两个结构体的内存func2::func(s1);//调用这个用到引用的函数,系统开销会小一些,不会有新的结构体形参变量出现。return 0;
}
在使用引用时需要注意一下几个问题:
-
&的位置是灵活的,一下几种定义完全相同
int& nr = num; int &nr = num; int & nr = num; -
在变量声明时出现&才是引用运算符(包括函数参数声明和函数返回类型的声明)
int &nr = num; int &f(int &nr, int &n); -
引用必须定义时初始化
float f; float &r1 = f; float &r2; r2 = f; //错误 -
const引用(常引用)。在定义引用时一般为左值(变量)。
左值,是指变量对应的那块内存区域,是可以放在赋值号左边的值;
右值,是指变量对应的内存区域中存储的数据值,是可以 放在赋值号右边的值;
常量、表达式都是右值,例如:
int i = 1; i = i+10; i+10 = i; //错误 i = 10; 10 = i; //错误可以使用const进行限制,使他成为不允许修改的常量引用。
int x = 10; // int &ri = 100; //error const int &r1 = 100; //ok 常引用 万能引用 const int &r2 = x; //ok // r1++; //error int a = 100; char &c = a; //错误,将c转换char类型,转换结果保存到临时变量中 实际引用临时变量,而临时变量是右值 -
引用的本质
引用的本质就是指针常量。
#include <iostream> using namespace std;void swap(int &x, int &y) { //交换函数int temp = x; //temp = *y;x = y; //*x = *y;y = temp; //*y = temp; }int main (void) {int x = 10, y = 20;swap(x, y);return 0; }