//引用
//作用:给变量起别名
//语法:数据类型 &别名 = 原名
1、基本使用
int main3()
{
int a = 10;
int& b = a;//创建引用
cout << "a = " << a << endl;
cout << "b = " << b << endl;
b = 20;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
2、引用的注意事项
//1、引用必须初始化
//2、引用在初始化后不可改变
int main4()
{
//int& b; //错误,创建的同时必须初始化
int a = 10;
int c = 20;
int& b = a;
b = c; //赋值->可以
//int& b = c; //错误,引用不能重定义
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
return 0;
}
3、引用做函数参数
//作用:函数传参时,可以利用引用让形参修饰实参
//优点:简化指针修改实参
void swap01(int a, int b) //值传递
{
int temp = a;
a = b;
b = temp;
}
void swap02(int* a, int* b) //地址传递
{
//int temp = *a;
//*a = *b;
//*b = temp;
int *temp = a; //只是交换了指针 a 和 b 的地址,没有交换指针所指向地址内的值
a = b; //(只是交换了*a *b 的值,主函数中a b 的值没有交换,所以主函数打印结果没变化
b = temp;
//cout << *a << endl; //可以交换a b 的值
//cout << *b << endl;
}
void swap03(int& a, int& b) //引用传递
{
int temp = a;
a = b;
b = temp;
}
int main5()
{
int a = 10;
int b = 20;
//swap01(a, b);
swap02(&a, &b);
//swap03(a, b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
system("pause");
return 0;
}
4、引用做函数返回值
//函数的调用可以作为左值
//注意:不要返回局部变量的引用
int test03()
{
int a = 10; //局部变量,存放在栈区
return a;
}
int& test04()
{
static int b = 20; //静态变量,全局区,程序结束后释放
return b;
}
int main6()
{
//不能返回局部变量的引用
//int& x = test03();
//cout << "x = " << x << endl;
//cout << "x = " << x << endl;
int &y = test04();
cout << "y = " << y << endl;
cout << "y = " << y << endl;
//函数的调用可以作为左值
test04() = 100; //相当于 b = 100; 用原名对 b 进行修改
cout << "y = " << y << endl; //y 是 b 的别名
cout << "y = " << y << endl;
return 0;
}
5、引用的本质
//本质:在C++内部实现是一个指针常量
void test05(int& x) //发现是引用,自动转换为 int* const x = &a;
{
x = 100; //x是引用,自动转换为 *x = 100;
}
int main7()
{
int a = 10;
int& b = a; //本质:编译器自动转换为 int* const b = &a; 指针常量的指针指向不可以修改,即引用不可以修改
b = 20; //本质:内部发现b 是引用,自动转换为:*b = 20;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
test05(a);
cout << "a = " << a << endl;
return 0;
}
6、常量引用
//作用:常量引用主要用来修饰形参,防止误操作 利用const修饰形参,防止形参改变实参
//打印数据的函数
void test06(const int& x)//只是打印函数,不希望其修改主函数中的实参,故加const修饰形参
{
//x = 100; //误操作,修改了主函数的实参
cout << x << endl;
}
int main8()
{
int a = 10;
int& b = a; //正确
//int& c = 10; //引用必须引一块合法的内存空间,10 为常量,存放在全局区
const int& c = 10; //加const后,编译器将代码修改为:int temp = 10; const int & c = temp;
//c = 20; //加const后,变为只读,不能修改
test06(a);
return 0;
}
(哔哩哔 哩黑马程序员 C++教程 学习笔记,如有侵权请联系删除)