一 引用的基本使用
作用:给变量起别名(操纵的是同一块内存空间)
语法:数据类型 &别名 = 原名
int main()
{
int a = 10;
int& b = a;//此处引用为 a 取了一个"别名"b
cout << b << endl;//输出10
b = 100;
cout << a << endl;//完成了对a的修改 输出100
system("pause");
return 0;
}
注意:引用不是定义一个新的变量,而是给已存在变量取了个别名,编译器不会为引用变量开辟内存空间 ,它与引用的变量指向同一块内存空间
二 引用的注意事项
- 引用必须初始化
- 引用在初始化后,不可以改变
int main()
{
int a = 1;
//int &c; //错误,引用必须初始化
int& b = a;//完成初始化后,就不可以再更改
system("pause");
return 0;
}
三 引用与函数
1.引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改实参
void Func(int&a)
{
a = 10;
}
int main()
{
int a = 1;
Func(a);//完成了对a值的修改,这与指针颇为类似,却又比指针更为简便
cout << a << endl;//输出10
system("pause");
return 0;
}
总结:通过引用参数产生的效果同按地址传递时一样的,引用的语法更为清楚简单
2.引用做函数返回值
作用:引用是可以作为函数的返回值存在的(注意:不要返回局部变量引用)
用法:函数调用作为左值
int& Func1()
{
int a = 10;//局部变量存放在内存四区中的栈区
return a;//函数执行完毕后就会被销毁,再次访问这个地址既是非法访问
}
int& Func2()
{
static int a = 100;//static 修饰的全局变量存放在全局区,程序结束后内存才会释放
return a;
}
int main()
{
int ret = Func1();
Func2() = 1000;//如果函数的返回值时引用,这个函数调用可以作为左值
system("pause");
return 0;
}
四 引用的本质
本质:引用的本质在c++内部实现是一个指针常量(指针的指向是不可以被修改的)
//发现是引用,转换为 int* const ref = &a;
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;
func(a);
return 0;
}
注意:
常量指针(常量的指针):指向常量的指针,是一个指向可改,值不可改的指针
指针常量(指针是常量):该指针是常量,是一个指向不可改,值可改的指针
五 常量引用
作用:常量引用主要用来修饰形参,防止误操作
在函数形参列表中,可以加const修饰常量,防止形参改变实参
//引用使用的场景,通常用来修饰形参
void Func(const int&a)
{
cout << a << endl;
}
int main()
{
//int&ref = 10;//引用本身需要一块合法的内存空间,因此这里运行错误
const int& ref = 10;//加上const就可以了,编译器优化代码,int tmp = 10;const int&ref = tmp
system("pause");
return 0;
}