int main()
{
int a = 10, C = 20;
int& b = a;
b = c; // 赋值?还是b变成c的别名?
return 0;
}
1.2 常引用
引用权限 可以平移或缩小 ,但是不能放大。
cpp复制代码
int main()
{
// 情形1
const int a = 10;
// int& a1 = a; // error
const int& a2 = a;
// 情形2
// int& b = 10; // error
const int& b1 = 10;// 10具有常属性,权限平移
// 情形3
int c = 10;
// double& c1 = c;// error,类型不同
const double& c2 = c;
// 隐式类型转换过程中,会创建一个具有常属性的临时变量
return 0;
}
1.3 使用场景
做参数
cpp复制代码
#include <iostream>
using namespace std;
void Swap(int& x, int& y)
{
int tmp = x;
x = y;
y = x;
}
int main()
{
int a = 10;
int b = 20;
Swap(a, b);
return 0;
}
做返回值
观察以下几个场景。
(a).
cpp复制代码
#include <iostream>
using namespace std;
int count1()
{
int n = 0;
n++;
return n;
}
int& count2()// 实际上是个错误程序
{
int n = 0;
n++;
return n;
}
int& count3()
{
static int n = 0;
n++;
return n;
}
int main()
{
int ret1 = count1();
cout << ret1 << endl;
int ret2 = count2();
cout << ret2 << endl;
int& ret3 = count2();
// ret3是n的别名,count2函数栈帧销毁后,ret3/n 的值是不确定的
cout << ret3 << endl;
cout << ret3 << endl;
int& ret4 = count3();
cout << ret4 << endl;
return 0;
}
(b).
cpp复制代码
#include <iostream>
using namespace std;
// static
int& Add1(int a, int b)
{
static int c = a + b;
return c;
}
int& Add2(int a, int b)
{
static int c;
c = a + b;
return c;
}
int main()
{
int& ret1 = Add1(1, 2);
cout << "Add1(1, 2) = " << ret1 << endl;
Add1(3, 4);
cout << "Add1(1, 2) = " << ret1 << endl << endl;
int& ret2 = Add2(1, 2);
cout << "Add2(1, 2) = " << ret2 << endl;
Add2(3, 4);
cout << "Add2(1, 2) = " << ret2 << endl << endl;
return 0;
}