1.命名空间
ps:
2.流的使用
ps:1.这里的流提取cin和cout指的是console in和console out
2.当使用流插入时,函数可以自动识别插入的类型,而不再像c语言那样写不同的%,并且endl自带换行操作
3.缺省参数
缺少参数又分为全缺省和半缺省
全缺省:
ps:这里的参数传入只能从左往右依次传入,不能间隔
半缺省:
ps:1.如果是半缺省,那么起码要传一个参数,这里的a必须有值
2.如果要缺省参数则必须从右往左依次缺省不能间隔
* 缺省参数在栈扩容中的运用
ps:平时在项目中,如果函数的声明和定义都有缺省并不同,则以声明为准
4.函数重载
函数重载三个不同:个数,类型,顺序
这里的顺序不同必须是不同类型,能够区分的不同,不能是同类型,否则编译器无法识别
ps:返回值不同也不能构成重载,因为编译器调用时无法区分 ,编译器调用时时根据函数名和变量名来形成符号表,再根据符号表查找到函数的具体地址进行调用,所以不同的返回值不能构成函数重载
C++支持函数重载的原理:
在汇编过程中把所有的函数名和对应函数的地址汇总成一张符号表,在链接时按照符号表进行调用,而c语言中,符号表中对应的函数名只有函数名本身,而c++中的符号表除了函数名本身还有变量名首字母等等不同的名字修饰。所以在c语言中,相同函数名之间在符号表中无法区分,因此会发生链接错误调用失败,而c++中拥有更加完善的名字修饰,相互之间可以区分所以c++支持函数重载
* 函数重载的在cout的运用
ps:根据右图可以看到,当调用iostream时,分为了istream和ostream,这里我们以ostream举例,下图stream源码中定义了许多重载函数,有int,unsigned int,long等等函数,当使用cout时,会根据传入的参数进行相应的匹配
5.引用
引用的三大特性
引用的运用场景
ps:如果不用引用,则需要用指针,并且函数得传地址,否则形参的改变不会改变实参
作为返回值返回
ps:这个能正常调用count,因为static存在静态区里面,如果没有static则存储变量在栈内,当count函数调用完成时会进行销毁,如果再使用返回值就会出现越界访问出现随机值,因此程序就无法运行
* 引用在顺序表中的运用
ps:因为顺序表存在堆中,所以当SLAT栈帧销毁时,使用引用作为返回值,当前地址并不会变成随机值,所以只需要定义一个SLAT函数就可以做到既读出指定位置的数据,又能修改指定位置的数据
引用和指针的区别
在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。 在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。
我们来看下引用和指针的汇编代码对比:
6.内联函数
内联函数:
宏函数的优缺点 |
宏函数的错误写法:
ps:宏函数本质上就是替换,如果要验算整个替换就行,后面加括号是因为涉及到优先级的问题
inline:
ps:举例说明第二点:当内联函数内容过长编译器就会忽略选择不展开,假设一个一百行的func,如果不展开循环1000次,则翻译出来的汇编代码有1000次call和一次func函数内容100行,如果选择展开,则有1000*100行,所以有时候编译器会选择过长不展开,如下图所示