引用经典案例
实现swap函数
#include <iostream>
using namespace std;
void swap1(int &a, int &b);
int main(void)
{
int x = 4, y = 6;
swap1(x, y);
cout << x << "," << y << endl;
return 0;
}
void swap1(int &a, int &b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
引用定义和识别的关键:&符号,注意与取地址无关
引用符号(不是变量)在定义时必须同时初始化,以后不能再另外赋值,只能使用
#include <iostream>
using namespace std;
void swap1(int &a, int &b);
int main(void)
{
int x = 4, y = 6;
int &b1 = x; //定义一个引用符号b1,关联到x
b1 = 44;
cout << x << endl; //输出x = 44
return 0;
}
引用和指针对比
(1)指针在C和C++中都有,且使用方法和实现本质完全相同;引用只有C++可用
(2)引用可以理解为功能弱化、安全性增强的低配版指针
(3)引用能做的事指针都能做,但指针能做的事引用不一定能做
(4)引用是它指向变量的“别名”,这个是从引用的使用效果角度讲的
(5)引用比指针弱的地方就是一个引用定义时绑定了一个变量,后面无法改变
(6)引用比指针强的地方也是没法改,所以不存在"野指针"问题,更安全
(7)引用主要用在函数传参和返回值
引用的本质剖析
1.引用可以加const修饰
(1)const int &b = a; 表示b是a的const别名,无法通过b修改a了
#include <iostream>
using namespace std;
int main(void)
{
int x = 4, y = 6;
const int &b1 = x;
x = 44;
// b1 = 44; 编译报错
(2)主要用在函数形参中,表示该函数内部不会修改实参的值。用在某些时候我们有一个非const类型的变量,但是我们在某个函数调用的过程中,不希望变量的值在函数内部被修改,这时候就可以用const引用来传参
int strcmp(const char &p1, const char &p2);
char a1 = 'A', a1 = 'b';
const char &ra1 = a1;
const char &ra2 = a2;
func(ra1, ra2); //在func内部不会修改 ra1和 ra2
a1 = 'B'; //实际上 a1和 a2可以修改
2.引用和sizeof运算符
(1)sizeof引用得到的不是引用本身的大小,而是引用指向的目标变量的大小
(2)在struct或class中定义一个引用,再sizeof整个struct或class就会不一样
#include <iostream>
using namespace std;
struct s1
{
int a;
int &b;
};
int main(void)
{
int x = 4;
double y = 6;
int &b1 = x;
double &b2 = y;
cout << sizeof(b1) << "--" << sizeof(b2) << endl;
cout << sizeof(struct s1) << endl;
return 0;
}
输出:
4–8
8
3.引用的本质是const指针