函数重载的定义
函数重载是函数一种特殊情况,C++允许在同一作用域中声明同一名称的函数,这些同名函数的形参必须不同
//可以重载,因为形参类型不同
bool Compare(int a, int b)
{
return a > b;
}
bool Compare(double a, double b)
{
return a > b;
}
//可以重载,因为形参个数不同
bool Compare(int a, int b)
{
return a > b;
}
bool Compare(int a, int b,int c)
{
return a > b = c;
}
//可以重载,因为形参顺序不同
bool Compare(int a, double b)
{
return a > b;
}
bool Compare(double a, int b)
{
return a > b;
}
//不能重载,因为与返回值类型无关
bool Compare(int a, int b)
{
return a > b;
}
int Compare(int a, int b)
{
return a > b ?a:b;
}
C++中支持函数重载,而C中不支持,主要与函数生成符号有关 ;在C语言中,函数符号的生成只与函数名称有关,而在C++中,函数符号的生成与函数名称、函数的返回值,参数类型有关,C语言中在链接阶段根据函数名找到要调用的函数,C++根据函数名称和参数类型找到要调用的函数,那么为什么函数的返回值不能作为函数重载的依据呢?以上面的代码为例,bool compare(int a,int b)生成的符号为?compare@@YA_NHH@Z,int compare(int a,int b)生成的符号为?compare@@YAHHH@Z,在main函数调用时,如果传的参数都为int型,那么系统如何确定要调用的是哪个函数,所以返回值类型不能作为函数重载的依据;
还有一组特别的例子:
void Fun(int a = 10)
{
cout<<"void Fun(int)"<<endl;
}
void Fun(int a)
{
cout<<"void Fun(int)"<<endl;
}
这两个函数可以重载吗?
第一个函数在调用时,可以传参也可以不传参,传参就用传的参数,不传就用a=10;第二个函数必须传参,所以当调用时传有参数就无法确定调用那个函数。
new与malloc
1、malloc为函数,new为关键字
2、malloc只能在堆上开辟内存,而new可以在自由存储区开辟
3、new可以初始化,而malloc只是单纯的开辟内存
4、new可以重载,因为new底层是operator new和construct (构造),而operator new使自己可以写的,所以在operator new中可以调用malloc函数;而malloc不能重载,因为malloc是系统提供的不允许修改
5、new可以调用malloc,而malloc不能调用new(new是C++之后的关键字,而malloc是C的库函数,C++能兼容C,而C不包含C++)
delete
1、释放内置类型时:
int* p = new int[10];
delete p;
释放时不会出错,因为释放变量,变量只分配空间,不赋予资源,所以释放时,只释放空间
2、释放对象时:
Test* ptest = new Test[10];
delete ptest;
释放对象会出错,因为释放对象,对象开辟空间并分配资源,所以释放时只能释放空间和ptest的一份资源,造成资源泄露