void TestRef()
{
int a = 10;
int& ra = a;//<====定义引用类型
printf("%pn", &a);
printf("%pn", &ra);
}
6.2
引用特性(尤为注意)
1.
引用在
定义时必须初始化
2.
一个变量可以有多个引用
3.
引用一旦引用一个实体,再不能引用其他实体
void TestRef()
{
int a = 10;
// int& ra; // 该条语句编译时会出错
int& ra = a;
int& rra = a;
printf("%p %p %pn", &a, &ra, &rra);
}
6.3
常引用
const int a;//把a变成常量
void TestConstRef()
{
const int a = 10;
//int& ra = a; // 该语句编译时会出错,a为常量
const int& ra = a;
// int& b = 10; // 该语句编译时会出错,b为常量
const int& b = 10;
double d = 12.34;
//int& rd = d; // 该语句编译时会出错,类型不同
const int& rd = d; }
因为引用的规律是:我变成你别名是有条件的:我用的可以缩小你的读写权限,但是不能放大你的权限;
常引用再函数定义时候的作用
1.减少空间占用,减少拷贝
2.可保护形参不会被改变
3.即可接收变量也可接收常量
如:
Add(20);
难点:
int i=10;
double d = i;
//double&r = i; 这段代码是错误的,因为这种类型转换的时候,系统是先给i拷贝到临时空间里面的,而临时空间又是具有常性的,所以这段代码就属于是放大了权限,而引用不能放大权限
const double&r = i; //这段代码可以完美执行,并且可以验证临时空间具有常性,因为这段不报错
6.4 使用场景 1. 做参数void Swap(int& left, int& right) {
int temp = left;
left = right;
right = temp; }
2.
做返回值
int& Count()
{
static int n = 0;
n++;
// ...
return n; }
//下面代码输出是什么?
int& Add(int a, int b) {
int c = a + b;
return c; }
int main()
{
int& ret = Add(1, 2);
Add(3, 4);
cout << "Add(1, 2) is :"<< ret <
结果是7,解释在下一章



