目录
1.函数重载
1.1概念:
同一作用域中同名的函数,且这些同名函数的参数个数不同或参数类型不同或参数顺序不同
1.2使用:
注意:函数重载与返回值无关
1.3浅谈C++支持重载的原因
在C语言中,汇编指令里的函数名就是函数的名字本身没加任何修饰;在C++中,汇编指令里的函数名不仅仅只有函数名,还使用了函数的参数进行修饰,使用了参数进行修饰的函数名更加复杂,但也使得C++能支持函数重载。
2.引用
2.1概念:
引用类型的变量不会创建一个新的变量,而是为另一个变量取一个别名,从语法层面上看,引用不会开空间,引用类型的变量和被引用的变量占用同一块空间
2.2性质:
1.引用在使用时必须初始化
2.一个变量可以有多个引用
3.一个引用一旦引用了一个对象,就不能再去引用其他对象
4.引用的权限只能小于等于被引用对象
补充:
2.3使用 :
1.作为函数参数使用,例如swap(int* a,int* b)函数不再需要传地址,只需将swap()函数的参数改为引用类型swap(int& a,int &b),既方便理解又方便操作
2.作为返回值,若使用引用做返回值,需要保证返回的对象在出当前作用域时还处于生命周期内,否则引用可能会变成空引用或野引用
2.4效率问题
当引用作为函数的参数时,能起到类似指针的效果,若给一个函数传入大量参数,值传参需要浪费大量空间,引用则只需要取别名;作为返回值时同理。
注意:引用在底层实现其实还是需要开空间的,是通过指针方式来实现的,在语法层面上用我们上面的概念来解释也是没有问题的
3.内联函数
3.1概念:
在C++中用inline修饰的函数叫作内联函数,与C的宏有些相似,编译时C++编译器会在调用内联函数处将函数体展开,无需建立栈帧
3.2性质:
1.内联函数声明和定义不能分离,若分离会出现链接错误
2.函数是否内联取决于编译器,当函数使用inline修饰时若函数体较小,编译器会将其视为内联函数,若函数体较大编译器可能会忽视inline。它可以防止当内联函数的函数体过大时导致的OBJ文件过大。
3.3优劣:
内联函数可以减少栈帧的建立次数,但同时会使用更大的空间。总的来说是一种空间换时间的做法。
4.auto关键字(C++11)
4.1概念:
使用auto修饰的变量可以根据初始化时右值的类型情况自动推导
4.2性质:
1.使用auto关键字修饰的变量必须初始化
2.auto不能作为函数参数,编译时无法确定函数类型
3.不能声明和定义数组
4.auto若是引用类型则必须加上&
5.auto类型变量同一行初始化时变量类型需相同
5.范围for循环(C++11)
5.1概念:
C++11中的范围for循环后的括号由冒号“ :”分为两部分:第一部分是迭代时用来记录序列中值的变量,第二部分则表示被迭代的序列
5.2使用条件:
需在序列范围可知的区域中使用,下面的例子就无法使用范围for
void Testfor(int a[])
{
for(auto& i : a)
cout<< i <<endl;
}
5.3使用:
下面是使用范围for和引用类型结合进行数组中值的改动
6.空指针nullptr
6.1为什么需要nullptr
在C中对NULL是这样定义的
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
可以看到如果我们是使用C++,NULL就被定义为0。NULL若是为0,下面这种场景我们就无法解决了,我们若是想让NULL调用第一个func(int*),0调用后一个func(int)
可以看到都调用后一个func(int)。为此,C++使用关键字nullptr表示空指针,这样上面的问题就得到了解决。
注意:nullptr可以直接使用,无需头文件。