引用
C++推荐使用引用,因为语法简洁,其本质是指针常量,但编译器帮我们完成了有关指针的操作
- 用途:给变量起别名,简化地址传递
- 语法:
数据类型& 别名 = 原名;
int a = 10;
int &b = a;
b = 20;
cout << a << endl; //20
cout << &a << endl << &b << endl; //输出的两个值是一样的
- 引用的本质
//引用的本质是指针常量
int main(){
int a = 10;
int& ref = a;
//编译器会将其转换为 int* const ref = &a;
//指针常量的指向不可更改,这也说明了为什么引用不可更改
ref = 20;
//编译器发现ref是引用,自动转换为 *ref = 20;
cout << a << endl; //20
cout << ref << endl; //20
int a = 10;
int b = 20;
int& r = a;
r = b;
// 这里并没有改变引用r的指向,只是把b的值赋给了r
printf("%p\n", &a);
printf("%p\n", &b);
printf("%p\n", &r);
// &a和&r是一样的
return 0;
}
- 注意事项:
- 引用必须初始化
- 引用在初始化后不可改变
- 引用作函数参数(引用传递)
void swap(int &a, int &b){
int t = a;a = b;b = t;
}
int main(){
int a = 10, b = 20;
swap(a, b);
cout << a << endl << b << endl;
return 0;
}
//20
//10
- 引用作函数返回值(不要返回局部变量的引用)
int& test(){
int a = 10;
return a;
}
int main(){
int &ref= test();
cout << ref << endl; //正确打印 10 因为编译器做了一次保留
cout << ref << endl; //打印乱码,因为局部变量已被销毁
cout << ref << endl;
cout << ref << endl;
}
- 如果函数的返回值是引用,则函数可以作为左值
int& test(){
static int a = 10;
return a;
}
int main(){
int &ref= test();
cout << ref << endl; //10
cout << ref << endl; //10
test() = 1000;
cout << ref << endl; //1000
cout << ref << endl; //1000
}
- 常量引用
在函数形参列表中,可以加const
修饰形参,防止形参改变实参
void showA(const int& a){
a = 2000; //错误,不能修改
cout << a;
}
int main(){
int& ref = 10; //错误,10是字面量,不代表一块内存空间
const int& ref = 10; //正确,编译器修改代码为 int temp = 10; const int & ref = temp;
ref = 20; //错误,不能修改
int a = 100;
showA(a);
}