文章目录
- 2.1 引用的基本使用
- 2.2 注意事项
- 2.3 引用作函数参数
- 2.4 引用作函数返回值
- 2.5 引用的本质
- 2.6 常量引用
2.1 引用的基本使用
作用: 给变量起别名,语法为 数据类型 &别名 = 原名
int main(){
int a = 100;
int &b = a;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
b = 111;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
a = 100
b = 100
a = 111
b = 111
2.2 注意事项
引用必须初始化,且在初始化后,其不可以改变。
int main(){
int a = 10, b = 20;
// int &c 引用必须初始化
int &c = a;
c = b; // 这是赋值操作,不是更改引用
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
return 0;
}
a = 20
b = 20
c = 20
2.3 引用作函数参数
作用: 函数传参时,可以利用引用的技术让形参修饰实参,进而可以简化指针修改实参的操作。
// 1. Value transfer 值传递
void swap_by_value(int a, int b){
int temp = a;
a = b;
b = temp;
}
// 2. Address transfer 地址传递
void swap_by_addr(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
// 3. Cite transfer 引用传递
void swap_by_cite(int &a, int &b){
int temp = a;
a = b;
b = temp;
}
int main(){
int a = 10, b = 20;
swap_by_value(a, b);
cout << "a = " << a << "\t" << "b = " << b << endl;
swap_by_addr(&a, &b);
cout << "a = " << a << "\t" << "b = " << b << endl;
swap_by_cite(a, b);
cout << "a = " << a << "\t" << "b = " << b << endl;
return 0;
}
a = 10 b = 20
a = 20 b = 10
a = 10 b = 20
总结:通过引用参数传递产生的效果同按地址传递是一样的,并且引用的语法更加清楚简单。
2.4 引用作函数返回值
作用: 引用是可以作为函数的返回值存在的,但有两个注意事项
示例1:不要返回局部变量引用
int & func(){
int a = 10;
return a; // 局部变量存放于四区中的栈区
}
int main(){
int &p = func();
cout << p << endl;
return 0;
}
main.cpp: In function ‘int& func()’:
main.cpp:7:12: warning: reference to local variable ‘a’ returned [-Wreturn-local-addr]
7 | return a;
| ^
main.cpp:6:9: note: declared here
6 | int a = 10;
|
示例2:函数调用作为左值
int & func(){
static int a = 10; // 静态变量存放于全局区,程序结束后由系统释放
return a;
}
int main(){
int &ref = func();
cout << "ref = " << ref << endl;
func() = 10000; // 如果函数返回值为引用,即该函数调用可以作为左值
cout << "ref = " << ref << endl;
return 0;
}
ref = 10
ref = 10000
2.5 引用的本质
本质:C++ 内部实现是一个指针常量
// int* const ref = &a;
void func(int& ref){
ref = 100; // *ref = 100
}
int main(){
int a = 10;
int& ref = a; // int* const ref = &a
ref = 20; // *ref = 20
cout << "a = " << a << "\t" << "ref = " << ref << endl;
func(a);
cout << "a = " << a << "\t" << "ref = " << ref << endl;
return 0;
}
a = 20 ref = 20
a = 100 ref = 100
结论:C++ 推荐使用引用技术,因为语法方便,引用的本质是指针常量,但是其所有的指针操作编译器都帮我们做了。
2.6 常量引用
作用: 常量引用主要用来修饰形参,防止误操作;在函数形参列表中,可以加 const
修饰形参,防止形参改变实参。
void showValue(const int& v) {
// v += 10;
cout << "v = " << v << endl;
}
int main() {
// int& ref = 10;
const int& ref = 10;
cout << "ref = " << ref << endl;
int a = 100;
showValue(a);
return 0;
}
ref = 10
v = 100