一、函数参数的默认值
C语言中没有函数参数默认值的概念、C++中函数参数可以有默认值
int fun(int a=10)在函数没有调用的时候,a自动赋值为10。
int fun(int a=10,int b)是不可以的,实参和形参自左向右匹配。
int fun(int a,int b=30)的时候,fun(20)传参数的时候为a=20,b=30。
int fun(int a=10,int b)虽然不可以,但是把int fun(int a,int b=30)放在后面是可以编译通过的,因为程序编译时根据其上文认为b的默认值为30,已经进行了压栈。
编译器函数的默认值就已经确定了,编译阶段看不到其他文件,所以函数默认值只在单文件有效。
注意*:
实参和形参匹配自左向右
函数默认值不能重复
一般放在声明上,因为函数的实现可能在调用后面,编译器可能看不到。
二、new和malloc的区别
new是C++中的关键,分配内存空间并进行初始化。
new和malloc区别
- new是关键字、malloc函数
- new在自由存储区、malloc在堆上
- new可以进行初始化、malloc只开辟内存
- new可以重载、malloc不能重载
- new可以调用malloc、malloc不能重写
- new可以开辟常量、malloc不可以
三、内联函数inline
内联函数inline是C++中的关键字。
内联函数在调用点直接展开来实现的,函数的参数压栈,减少由函数调用带来的开销,从而提高程序的运行效率。
inline只是对编译器的一个建议,不是所有的inline都处理成内联函数,递归就不能处理成内联函数,凡是带有while,for,switch的都不能处理成内联函数。
内联函数和宏的区别
(1)宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。宏定义在使用时只是简单的文本替换,并没有做严格的参数检查,内联函数会进行检查。
(2)它的返回值也不能被强制转换为可转换的合适的类型,它的使用就存在着一系列的隐患和局限性。
内联函数和static的区别
(1)inline函数没有开栈清栈开销、static有
(2)inline函数因为编译阶段代码展开导致本文件可见,static属性l为本文件可见
注意*:
inline一般写在头文件中
inline只在Release版本生效
inline只是给编译器一个建议
是基于实现、不是基于声明
以代码膨胀为代价,空间换时间
四、函数重载
函数重载三要素:函数名相同、参数列表不同、作用域相同。
静多态,编译时决定的多态。(同一接口、不同形态就是多态)
C语言函数符号的生成只和函数名有关,所以C语言同一文件不能用同名函数,所以C语言不能进行函数重载。
C++函数生成符号的规则:
?Sum@@YAHHH@Z(某函数生成的符号)
?Sum@@YANNN@Z(某函数生成的符号)
C++函数符号生成和函数原型有关:
(1)函数返回值
(2)函数名称
(3)函数的形参:形参个数、形参类型、形参顺序
不能用只用返回值类型重载函数,因为在调用点看不见函数返回值类型。
五、using namespace
为了解决变量和函数等的作用范围,在C++语言中引入了名空间的概念,并增加了关键字namespace和using。使用using namespace std之后,就省去了std::,可以直接引用std空间里面的函数和变量。
#include <conio.h>
#include <iostream.h>
namespace car // 名空间的定义
{
void ShowLength(double len) // 参数类型为double
{
cout<<"in car namespace: "<<len<<endl;
}
}
namespace plane // 名空间的定义
{
void ShowLength(int len) // 参数类型为i n t
{
cout<<"in plane namespace: "<<len<<endl;
}
}
void main()
{
using namespace car;
ShowLength(3);
ShowLength(3.8);
using namespace plane;
ShowLength(93);
ShowLength(93.75);
getch();
}
同名的名字空间作用域会合并
六、const的使用
修饰变量
C语言中的const在编译阶段,常变量是否做左值,其他处理和变量是一样的。
C语言中const修饰全局变量和局部变量没有区别。
const int a;
int *p=&a;
*p = 20;//ok
C++中用const叫做常量,在编译阶段把用到常量的地方进行初始化。
C++中const修饰全局变量只在本文件可见,一定要要外部可见用extern关键字。
- 一定要初始化
- 不能做左值
- 不能间接修改,杜绝间接访问来修改常量内存的风险
const int a=10;
int* p=&a;//有修改的风险,报错//const int* p=&a这是可以的
修饰函数
修饰对象:常对象的成员都是常属性,不能修改,常对象不能调用普通方法
七、引用
引用就是给变量起别名int &a=b;
- 一定要初始化
- 引用只能引用可以取地址的数据
- 引用不可以改变