1.
引用:给变量起别名
语法:数据类型(跟原名的一样) &别名 = 原名
int &b = a;
b=20;
cout << a << endl; //因为a与b都指向相同一块内存
2.注意事项
(1)引用必须初始化
不能一开始就int &b;必须一开始就告诉是谁的别名
(2)初始化后引用不可改变
int &b = a;后
不可以再 int &b = c; //只能引用一个变量,不能同时几个
int a =10;int c = 20;
int &b = a;
int &b = c;
cout << a << endl; //因为a与b指向同一块内存,现在b与c也指向同一块内存,则根据整型顺序,c的值赋给b,b改变也意味着a的值改变。等于C的赋值
3.引用做函数参数
引用函数的值传递也可以修改参数
将变量的值传输到引用函数中给变量起的别名里,使这个别名也代表那段地址。则引用函数中的别名的值的改变,也代表地址所表示的值的变化
(1)实现函数交换
//值传递
void trans1(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
//地址传递
void trans2(int *a, int *b) //创建两个指针变量接收地址
{
int temp;
temp = *a; //接受的地址解引用
*a = *b;
*b = temp;
}
//引用传递
void trans3(int &a, int &b) //上面这个a是下面主函数a的别名。这个a也代表那段地址的值。
//在这函数中这个a值的改变也代表地址值的改变,进而影响到了主函数中a的值
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int a = 10; int b = 20;
trans1(a,b);
trans2(&a, &b);
trans3(a, b); //传输的不是地址,只是把值赋给了引用函数中的别名里
cout << "a=" << a << endl;
cout << "b=" << b << endl;
system("pause");
return 0;
}
4.引用做函数返回值
(1)不要返回局部变量的引用
//不要返回局部变量的引用
int& trans1() //返回值类型 函数名 (参数列表)
{
int a = 10; //局部变量存放在栈区
return a; //这里返回的值是a,然后int &a 代表返回值类型,所以这里返回的是一个别名
}
int main()
{
int &ref1 = trans1(); //trans1()是一个别名,用int &ref接收这个别名并用ref表示
cout << "ref1=" << ref1 << endl;
cout << "ref1=" << ref1 << endl;//因为第二次地址已被释放掉
system("pause");
return 0;
}
(2)函数的调用可以作为左值(等式左边的值)和a先是局部变量后改成全局变量后的输出问题
//不要返回局部变量的引用
int& trans1() //返回值类型 函数名 (参数列表)
{
int a = 10; //局部变量存放在栈区
return a; //这里返回的值是a,然后int &a 代表返回值类型,所以这里返回的是一个别名
}
//函数的调用可以作为左值(等式左边的值)
int& trans2() //返回值类型 函数名 (参数列表)
{
static int a = 10; //静态变量存放在全局区,数据在程序结束后由系统释放掉
return a; //这里返回的值是a,然后int &a 代表返回值类型,所以这里返回的是一个别名
}
int main()
{
int &ref1 = trans1(); //trans1()是一个别名,用int &ref接收这个别名并用ref表示
int &ref2 = trans2();
cout << "ref1=" << ref1 << endl; //这里输出的也是乱的数值,猜测原因是trans1()执行后,trans2()
//将a的内存地址从栈区变换到了全局区,使得ref1所指向的地址已没有,所以输出的为乱码
//这里如果把trans2()移到trans1()前,则都输出为10
cout << "ref1=" << ref1 << endl;//因为第二次地址已被释放掉
cout << "ref2=" << ref2 << endl; //因为全局变量由系统在程序结束后释放
trans2() = 1000; //相当于a = 1000;
cout << "ref2=" << ref2 << endl; //ref2所指向的地址被赋予了1000的值,所以输出变化
system("pause");
return 0;
}
5.引用的本质
本质就是一个指针常量,初始化后不能改变是因为这是一个指定方向的指针
int main()
{
int a = 10; //开辟内存
int &ref = a; //相当于 int * const ref = &a ,创建了一个指针常量ref的指向不变,值可变
ref = 20; //等于就是*ref = 20;
system("pause");
return 0;
}
6.常量引用
(1)概念理解
int a = 10; //开辟内存
//int &ref = 10; //这样不行,应用必须是溢出合法的内存空间,得有地址
//加上const 相当于 int temp = 10;const int &ref = temp;相当于创建了临时空间,所以这里只有别名没有原名
const int &ref = 10;
//ref = 20; 这个值应将成了常数,只读状态,不可更改
(2)const修饰防止误操作
void showvalue(const int &a) //使这个a变为只读状态的常数
{
//a = 45; 不能修改
}
int main()
{
int a = 23;
showvalue(a);
cout << "a = " << a << endl;
system("pause");
return 0;
}