1.引用
1.引用的概念
引用是指给已有的变量取个别名,使用引用不会开辟新的空间,引用取的别名和引用的变量指向的是同一块空间
简单点就是说:你原来叫张三,我给你取个小名叫王麻子,这两个名字指向的都是同一个人
2.引用的使用
引用的关键字是' & ',同时这个符号也表示按位与,但应用场景不同,容易区分。
使用方法:
int& b = a; //int(变量类型)+'&'(引用关键字) 引用名(要取的小名) = 被引用的变量(大名)
使用事项:
- 引用时必须进行初始化
- 当我们引用了一个变量之后就不能再引用其他变量
- 一个变量可以被多次引用,就是一个人可以有多个名字
#include<iostream> using namespace std; int mian() { int a = 10; int& b = a; //int& b;//错误示范,在引用时没有进行初始化 int& c = a;//一个变量可以有多个引用别名,b和c都指向a的空间,输出都是a的值 int d = 9; int& b = d;//此时b已经是a的别名了,不能再是d的别名,此时是将d中的值赋值给b,那么a和c都为9 }
#include<iostream>using namespace std int main() { int a = 10;//定义一个整形变量a,=10 int& b = a;//整形int关键字+' & '表示引用类型关键字,引用所指向的类型为int //这里将a取了个别名b,他们指向同一块空间 //char c = ' E '; //int& d = c;//c是字符类型的变量,而引用所指向的变量是整形,指向类型不符合报错 }
可见引用时使用的变量类型必须与被只指向的类型相同,否则报错
const修饰的引用
#include<iostream> using namespace std; int main() { //情况1:const修饰的变量被未修饰的引用变量所引用 const int a = 666;//a说我已经被const修饰了,我的空间中的值不能被更改了 int& b = a;//b说我没有被const修饰,所以我引用的变量应该是可已被修改的, //但是你个a是不能被修改的,还给我引用,肯定会被报错 //不能被更改的 --> 能被更改的 【权限的放大】【不可以的】 //情况2:为被const修饰的变量被已修饰的引用变量所引用 int c = 999;//未被修饰 const int& d = c;//被const修饰,d和c所指空间相同,引用时const会对a的空间中值进行修饰,不可更改 //能被更改的 --> 不能被更改的 【权限的缩小】【可以的】 return 0; }
3.引用与指针的区别
假设有开辟了一段空间A,那么引用就是给空间A取了另外一个名字,指针就是这段空间的地址,一个是空间的别名字,一个是空间的地址。
4.引用的例子
(1)引用做函数返回值
int Add(int a, int b)
{
return a + b;
}//a+b先给了一个中间变量tmp,然后再返回给函数返回值
int& Add(int a, int b)
{
static int tmp = a + b;
return tmp;
}//此时返回的过程就是int& c = tmp;返回的就是c,就是返回的是tmp的别名
上面两个相比就是返回值会把值先给中间值再返回,返回引用就是返回变量的别名,前者需要一个赋值给中间变量的过程。在使用引用返回时,不需要额外的开空间,可以节省空间。
(2)引用做函数参数
以前在学习C语言的时候,我们使用函数进行交换两个变量的值时,是只能使用指针来进行传参,而现在也可以通过引用作为参数来实现,如下:
void Swap(int& a,int& b)
{
int tmp = a;
a = b;
b = tmp;
}
在这个程序中参数传的是a,b的别名,实际上操作的参数还是a,b,节省了创建局部变量在栈区开辟空间。
2.内联函数
内联函数就是在函数前加上内联关键字inline,使得函数在调用时在调用的地方直接展开,不需要像以前一样在调用函数的时候,在栈区上开辟一段空间,减少了栈的创建与销毁,提高了程序的效率,但是在程序中展开增加了空间,可以看出inline是一种以空间换时间的方法。
这跟宏替换类似,在预处理阶段,对宏定义变量进行内容替换,内联函数也是在预处理时在函数调用时用函数体对函数进行替换。
注意的是,如果函数的代码量比较小或者调用频率低的时候使用inline,提升了效率,也浪费不了多少空间,但如果函数的代码量比较多或者调用频率高的时候就应该考虑是否使用inline。
还有就是如果使用inline的话,不建议将函数的声明与定义分开,为什么呢?
首先我们要知道预处理时inline函数展开,那么声明时候的inline就会被展开,同时会使得汇编阶段会将用inline声明函数不放到符号表中,那么在可执行文件中调用声明的头文件中就找不到这个函数了,这就称为调用时失去了函数链接