引用的概念及用法
引用:给一个已经定义了的变量重新起一个别名。
定义格式:
类型&引用变量名=已定义的变量名
引用原则
- 引用必须在定义的时候就给定引用对象,而且一个引用变量只能引用唯一的一个已经定义的变量。
- 一个变量可以有多个不同的引用变量。
- 引用变量也是变量,也可以被引用。
- 不允许创建引用的引用,也不能有指针的引用,不能建立数组的引用。
int a = 10;
int&&b = a;//错误
int& *p=&a;//错误
引用中的const
我们知道在C语言中const变量不能直接被修改,可以通过指针被修改,这个属性被称之为具有常属性的变量。而在C++中const修饰的数量就是常量。
int a = 10;int&b = a;
int a = 10;const int&b = a;
const int a = 10;const int&b = a;
以上三种均合法
const int a = 10;int&b = a;
const int a;
中的a是常量,而定义的引用b是一个变量,不能给常量赋变量值。类似于int a=0;10=a;
肯定是错误的语句。
引用这里的的const遵循以下原则
- 非const变量在被引用时候,可以被const引用变量和非const引用变量引用;而const变量只能被const引用变量引用。
引用做函数参数
- 引用作为函数参数会比传值调用更加高效,因为传值存在值拷贝的代价。
- 会比传址调用更加安全,因为指针可以指向空,而引用必须有唯一确定的引用对象。
- 引用作为函数参数可以改变实例中的参数,因为它是变量的别名,如果不允许改变实例参数,可以在参数列表加const限定。
#include<iostream>
int Add(const int& a, const int& b)
{
return a + b;
}
int main()
{
int a = 80;
int b = 20;
std::cout<<Add(a, b)<<std::endl;
system("pause");
}
引用做函数返回值
优点:函数结束之后,函数栈帧销毁,而引用变量在堆上申请,采用引用变量做返回值,更加安全。
#include<iostream>
int& Add(int& a, const int& b)
{
a = a + b;
return a;
}
int main()
{
int a = 80;
int b = 20;
std::cout<<Add(a, b)<<std::endl;
system("pause");
}
深层次看引用
引用的实质
引用和指针的底层实现是一样的,也就是说,定义一个变量a的引用变量b,在底层实际上就是定义了b变量存储了a的地址。而系统知道哪个是引用,哪个是指针,会根据它们各自的性质去执行各自允许执行的操作。
引用和指针的对比
- 定义:指针变量的内容是原变量的地址,调用原变量时候需要显示解引用调用;引用变量是原变量的别名引用的行为等同于原变量行为。
- 引用只能在变量定义时候初始化一次(从一而终),而指针变量的值可以更改。
- 引用必须指向有效的变量,而指针可以是空指针。
- sizeof(引用变量)等同于sizeof(原变量);sizeof(指针)是4或者8。
- 指针在使用时候,需要注意指针是否为空;释放指针所指向的地址时候,需要置空,否则可能存在野指针问题。