命名空间
前言:c++中为了解决用户对变量或者函数进行命名时与编译器标准库的变量名或者函数名产生命名冲突,所以命名空间出现了。
语法:
namespace 名称 { }
例:
平时如果我们将一个变量定义成count,就会出现:count不明确这样的报错,这是因为与标准库里面有命名冲突
而我们使用命名空间之后就不会再出现的报错,如图1.
因为:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中,所以在我们要使用命名空间里面的东西的时候,有以下几种方法
1. 使用前面指明作用域 ::
2. 使用using
用法一:展开一部分
展开我们想要使用的东西,例如:对于标准库,只展开我们常用的cout,cin
using std::cin;
using std::cout;
用法二:展开整个命名空间
注:全展开,就相当于我们之前使用的作用域全部失效了,这种方法一般是不推荐的。
我们平时打的using namespace std; 就是将std这个命名空间全展开,然后我们就可以使用里面的cin,cout…
缺省参数(默认参数)
概念:
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
注:如果声明和定义分开,只需在其中一处有默认参数就可以了
分类
1.全缺省
2.半缺省
注:
- 半缺省,只能从右边开始依次往左边给默认参数。 即如图中,不能a有默认参数,而b没有默认参数。
- 缺省参数不能在函数声明和定义中同时出现
- 缺省值可以是变量,但必须是全局变量
函数重载
概念
是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
函数重载的规则
满足下面任意一条就可以构成函数重载
- 参数个数不同
- 参数的类型不同
- 参数类型的顺序不同
而唯一要注意的是:返回值类型不同是不能构成函数重载的
内联函数
概念
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
例:
没有使用inline修饰的函数,调用时会建立栈帧
在汇编代码下是如此:
call 即调用的意思
而加了inline,函数就会在被调用的地方被展开
对比上面的汇编代码,可看到我们这里没有了函数调用,而是将代码在调用的位置处展开了。而汇编代码的大概意思是:先将3赋给eax这个寄存器变量,然后再使其加上4,最后再将eax的值赋给变量a。
而在debug模式(因为debug模式,编译器不会对代码进行优化)下如果想看内联函数在被调用时在调用处展开需要进行以下操作:
1.在解决方案处点击属性
2.点开c/c++,点击常规,找到常规,将其中调试信息格式框设置为程序数据库
3.再找到优化,将内部函数扩展设置成图中所示
注意:
inline关键字并不是强制实施的,只是对编译器的建议,具体是否会进行相应操作,还是取决编译器。
auto关键字
含义:
auto作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
注意:
- auto声明的变量必须在定义时初始化(因为auto变量类型推导是在编译时期实现的)
- auto声明变量引用时,要使用auto&
- 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
auto不能推导的场景
1.auto声明数组
2.auto做函数参数
范围for
语法:
for( 被迭代的变量 :被迭代的范围){}
适用:遍历数组
例:
注:
1. for循环迭代的范围必须是确定的
2.与普通循环一样,可以使用coutinue,break对循环进行操控