C++:函数的重载

函数重载的定义

函数重载是函数一种特殊情况,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的一份资源,造成资源泄露 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值