文章目录
- 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 here6 | 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 = &aref = 20; // *ref = 20cout << "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