目录
目录:
1. 引用
2. 内联函数inline
3.auto关键字(大概的认识)
4.基于范围的for循环(c++11)
5.nullptr(c++11)
本章最重要的知识点其实是前两个(详细讲解),后面的大概只会介绍一下用法。
文章开始!!!!
1:引用
1.1引用概念
语法: 类型& 引用变量名 = 引用实体;
引用概念:引用并不是新的变量,而是给一个已知的变量起一个别名,相信别名(小名)这个东西在我们日常当中并不是很少见的,比如说孙悟空的别名--->悟空--->齐天大圣--->大圣-->猴子....从这个例子我们也可以看出来,尽管别名可能不相同,但是这些别名都是指向同一个人的。这也说明了我们的引用其实并不是开辟一块新空间,而是与引用的对象共用同一块内存空间!!
用下图来理解!
上面代码的意思是,定义了一个变量a值为10,然后在给a起一个别名,叫做b,a和b是共用同一块内存空间的。
我们在vs条件下通过监视窗口也可以看出,他们是共用同一块内存空间的。
需要注意的是我们在引用时,引用类型必须和引用实体类型相同。比如说
1.2引用特性
1:引用在定义时必须初始化,没有空引用
2: 一个变量可以有多个引用
3: 引用一旦有了一个实体,就不能引用其他的实体
我们通过图来讲解
1:引用必须初始化
2:一个变量可以有多个引用,这就相当于我们前面举得例子(孙悟空),代码如下
3:引用一旦有了实体之后,就不能在引用其他的变量了,还是通过具体的代码来进行讲解。
到这里我么引用的特性就基本上讲解完毕了。
1.3常引用(const)
我们通过代码来进行讲解,这里面还会涉及一些代码的权限,变量在赋值是会干啥的知识点。
加了const,可以将不同类型的引用用起来,但是可能会丢失数据。
首先在讲解这个知识点之前,我们还需要额外的知识点。
权限不能放大,只能缩小。
代码如下:
1.4 引用的使用场景
1.4.1引用做参数
我们直接上代码进行讲解。
这是一个交换变量值函数的实现,有了引用之后我们就可以直接使用引用来实现了。
1.4.2:引用做返回值
我们先上一份代码:
int& Fun()
{
int n = 10;
n++;
return n;
}
int main()
{
cout << Fun() << endl;
return 0;
}
那么这里返回值是啥意思呢?
如果引用做返回值,那么我们实际返回的内容,就是n的别名。
我们知道局部变量出作用域的时候,会销毁。我们通过图来解释这段代码的值。
1.5 引用做参数与返回值对于性能的影响
我们知道,当我们函数在传参或返回一个很大的空间的时候,我们的形参会对实参进行拷贝,当实参非常大的时候,那么我们的效率会大大的降低,而用引用却可以大大的提高时间,它并不需要对实参进行拷贝。
所以我们只需要记住:引用可以提高函数在传参或做返回值时候的效率。
1.6指针与引用的区别 (重点)
1.引用必须初始化,指针可以不初始化。
2.引用一旦有了引用实体之后,就不能改变引用的指向了,指针可以改变指向。
3.有多级指针,无多级引用。
4.引用只是给变量起一个别名不开辟空间,指针会开辟空间存储一个变量地址
5.引用无NULL值,指针有NULL值
6.使用sizeof的时候,sizeof(指针)的大小是4或8,sizeof(引用)为引用类型的大小,
7.引用相对于指针来说比较安全。
8.指针与引用的使用方式不同,指针需要进行解引用操作,引用为编译器处理。
2:内联函数(inline)
关键字:inline
使用语法:只需要在定义完函数前面加一个inline来修饰即可。
概念:以inline修饰的函数就称为内联函数,inline修饰的函数,编译器会自动将它展开,减少了函数栈帧的开销,提高了时间效率。
但是这个展开并不是绝对的,并不是写了内联函数我们就会在相应的地方进行展开,如果直接展开的话,可能会增加可执行程序的大小。具体的展开可能编译器会帮助我们来进行检查。
当我们使用inline前我们还需要在编译器中调一下相关的设置,具体的步骤如下。
当一个内联函数的代码量非常少时,我们调用它的时候,编译器的汇编代码就不会有call这个需要开辟函数栈帧的汇编代码了。
总结:内联函数的优点:提高了时间效率,少了函数栈帧的开销。缺点:提高了程序的代码量,可能会导致目标文件变大。
且内联函数就相当于向编译器发送一个请求,以空间来换时间的做法。
c++中:用enum,const替换了宏常量,内联函数替换了宏。
3:auto关键字(c++11)
auto可以自动识别定义的变量,这样假如我们有一个变量类型的名字非常多的时候,auto是非常实用的。
这个关键字以后会进行讲解。
4:基于范围的for循环(c++11)
如果我们需要遍历一个数组我们可以这样写。
使用时的语法我们以:为分界线,:前面的是用来进行迭代的变量,后面的是用来遍历的数组。
这个程序的意思是:将数组中的值拷贝到e中去,打印,然后自动++,自动判断结束。
5:nullptr(c++11)关键字
不需要引入相关的头文件,它是一个关键字。
其实nullptr的这个关键字的作用与NULL相似,只是说我们c语言中这个NULL为宏常量
相当于#define NULL 0;
nullptr就真正的为指针类型(void*)0.
感谢大家的耐心观看。