C++核心_2引用
2 引用:给变量起别名
2.1 引用基本使用(改别名,原名会变)
# include<iostream>
using namespace std;
int main() {
int a = 10;
int& b = a;
cout << "改前a=" << a << endl;
cout << "改前b=" << b << endl;
b = 100;
cout << "改后a=" << a << endl;
cout << "改后b=" << b << endl;
return 0;
}
2.2 引用注意事项(引用必须初始化,并且不能更改)
# include<iostream>
using namespace std;
int main() {
int a = 10;
int& b = a;
//1引用必须初始化
int& c; //报错
//2不能更改引用
int d = b; //赋值操作
return 0;
}
2.3 引用做函数参数
作用:函数传参时,引用让形参修饰实参 (地址传递,引用传递)
优点:简化指针修改实参
# include<iostream>
using namespace std;
// 函数交换
//1 值传递
void myswap01(int a, int b)
{
int temp = b;
b = a;
a = temp;
}
//2 地址传递
void myswap02(int *a, int *b)
{
int temp = *b;
*b = *a;
*a = temp;
}
//3 引用传递
void myswap03(int&a, int&b)
{
int temp = b;
b = a;
a = temp;
}
int main() {
int a = 10;
int b = 20;
//myswap01(a, b);
//myswap02(&a, &b); // 地址传递,形参修饰实参
myswap03(a, b); // 引用传递,形参修饰实参
cout << "myswap03 " << " a=" << a << " b=" << b << endl;
return 0;
}
2.4 引用做函数返回值
1、不要返回局部变量的引用
2、函数的调用可以作为左值
# include<iostream>
using namespace std;
int& test1() {
int a = 10;
cout << "ref1 = " << a << endl;
return a;
}
int& test2() {
static int a = 10; // static方法将其定义为 静态变量
cout << "ref2 = " << a << endl;
return a;
}
int main() {
// 引用做函数返回值
// 1 不要返回局部变量的引用
int& ref1 = test1();
cout << "ref1 = " << ref1 << endl;
// 2 函数的调用可以作为左值
int& ref2 = test2();
cout << "ref2 = " << ref2 << endl;
system("pause");
return 0;
}
2.5 引用的本质
引用的本质:在c++内部实现是一个指针常量
c++推荐使用,语法方便,所有的指针操作编译器已经帮忙实现
# include<iostream>
using namespace std;
void func(int& ref) {
ref = 100; //ref是引用,转换为 *ref = 100
}
int main() {
int a = 10;
// 自动转换为 int* const ref = &a; 指针常量 指向不能改 所以 引用不能改
int& ref = a;
ref = 20; // 内部发现是ref 引用,会自动帮我们转换为 : *ref = 20;
cout << "a:" << a << endl;
cout << "ref:" << ref << endl;
func(a);
cout << "ref:" << ref << endl;
system("pause");
return 0;
}
2.6 常量引用
作用:修饰形参,防止误操作
在函数列表中,可以加const修饰形参,防止形参改变实参
# include<iostream>
using namespace std;
void showvalue(int &val)
{
val = 1001;
cout << "val==" << val << endl;
}
void showvalue2(const int &val)
{
//val = 1000; // 会提示不能修改
cout << "val==" << val << endl;
}
int main() {
int a = 10;
int& ref = a; // 引用必须是合法的内存空间
// 加const后,编译器将代码修改为 int temp = 10; const int & ref = temp;
const int& refa = 10; // 原名编译器起好了但不知道,ref是别名 const 只读,不能修改
int b=100;
showvalue(b);
showvalue2(b);
system("pause");
return 0;
}