1. 引用的概念
引用与指针非常相似,但是弱化了程序员对内存的控制,引用已经被其它的面向对象编程语言大量使用,这些编程语言都删除了指针。C++同时支持指针与引用。
引用使用&来表示一个变量的“别名”,对引用进行操作与直接操作变量完全一样。
#include <iostream>
using namespace std;
int main()
{
int a = 100;
// b是a的引用
int& b = a;
cout << "地址:" << &a << " " << &b << endl; // 0x61fe88 0x61fe88
b++;
cout << a << endl; // 101
return 0;
}
2. 引用的性质
- 可以改变引用的变量的值,但是不能再次成为其它变量的引用
#include <iostream>
using namespace std;
int main()
{
int a = 100;
// b是a的引用
int& b = a;
int c = 200;
b = c; // b不会成为c的引用,只是完成了赋值
cout << &a << " " << &b << " " << &c << endl; // 0x61fe78 0x61fe78 0x61fe74
cout << a << " " << b << " " << c << endl; // 200 200 200
// &b = c; 错误
// int& b = c; 错误
return 0;
}
- 声明引用时,必须同时对其进行初始化。
#include <iostream>
using namespace std;
int main()
{
int a = 100;
// int& b; 错误
int& b = a;
return 0;
}
- 声明引用时,初始化的值不能是NULL
#include <iostream>
using namespace std;
int main()
{
// int& b = NULL; 错误
return 0;
}
- 声明引用时,初始化的值可以使纯数值,但是此时需要使用const关键字修饰引用,表示引用的值不可变,也称为“常引用”。
#include <iostream>
using namespace std;
int main()
{
// int& b = 200; 错误
// b是常引用
const int& b = 200;
// b++; 错误
cout << b << endl;
return 0;
}
- 可以将变量引用的地址赋值给一个指针,此时指针指向的还是原来的变量。
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int& b = a;
int* c = &b; // c指向b,b是a的引用,相当于c指向了a
cout << *c << endl; // 10
return 0;
}
- 可以建立指针的引用
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int* b = &a; // b指向了a
int*& c = b; // c是b的别名
cout << c << " " << b << endl; // 0x61fe88 0x61fe88
cout << *c << " " << *b << endl; // 10 10
return 0;
}
- 可以用const修饰引用,此时不允许改变引用的值,但是可以改变原变量的值。
#include <iostream>
using namespace std;
int main()
{
int a = 10;
const int& b = a; // b是a的常引用
// b++; 错误
a++;
cout << a << " " << b << endl; // 11 11
return 0;
}