C++出现了新的概念:引用。引用是某个变量的别名。
语法格式如下:
? 类型 &引用名 = 变量名;
#include <iostream>
using namespace std;
int main (void) {
int num = 8;
int &nr = num;
cout << "num = " << num << endl;//num = 8
cout << "nr = " << nr << endl;//nr = 8
cout << "num的地址: " << &num << endl; //num的地址: 0xbfcdf738
cout << "nr的地址: " << &nr << endl;//nr的地址: 0xbfcdf738
return 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;
}