C++中缺省参数和函数重载

缺省参数概念:

       缺省参数是声明或定义函数时为函数的参数指定一个默认值,在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。

举例说明

#include<malloc.h>
void *GetMemory(int size = 100)
{
 cout << size << endl;
 return malloc(size);
}
int main()
{
 GetMemory();
 GetMemory(10);
 return 0;
}

缺省参数分类:
(1)全缺省参数

void TestFunc1(int a = 1, int b = 2, int c = 3)

(2)半缺省参数

void TestFunc2(int a , int b =2, int c=3 )

注意:
(1) 半缺省参数必须从右往左依次给出,不能间隔着给。

void TestFunc1(int a = 1, int b , int c = 3)//这是错误的

(2 ) 缺省参数不能再函数声明和定义中同时出现

void TestFunc3(int a = 10);
void TestFunc3(int a = 20)//不知道是用10还是20
{
}

(3) 缺省值必须是常量或者全局变量

(4) C语言不支持(编译器不支持)
函数重载

        是函数的一种特殊情况,c++允许在同一作用域中申明几个功能类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序 )必须不同,常用来处理实现功能类似数据类型不同的问题。

如下图代码:

int Add(int left, int right)
{
 return left + right;
}
double Add(double left, double right)
{
 return left + right;
}
char Add(char left, char right)
{
 return left + right;
}
int main()
{
 cout << Add(1, 2) << endl;
 cout << Add(1.0, 2.0) << endl;
 cout << Add('1', '2') << endl;
 return 0;
}

上面Add函数构成重载。(编译器在编译期间,需要根据实参的类型确定具体需要调用哪个函数.)
参数列表不同具体体现在哪些方面?

//函数1
void TestFunc(int a)
{}
//函数2
//参数的类型不一样
void TestFunc(char a)
{}
//函数3
//参数的个数不一样
void TestFunc(int a,char b)
{}
//函数4
//参数类型的次序不一样
void TestFunc(char a,int b)
{}
//函数5
//int TestFunc(int a)
//{}

需注意:(1)如果两个函数仅仅只是返回值类型不一样,不能形成重载(函数1和函数5)。
              (2)尽量避免无参和带有全缺省参数的函数形成重载

//这种调用方式是错误的,编译器不知道会调用哪一个函数
void TestFunc()
{}
void TestFunc(int a = 10)
{}
int main()
{
 TestFunc();
 retur;
 }

运行结果:

常见的面试题:(1)为什么c++支持函数重载?而c语言不行?

             答:在c语言中,编译器对函数名字的修饰规则:简单的在函数名字前面加_

而在C++中

编译器对函数名字的修饰规则:把函数的返回值类型和参数类型编译到函数的名字中(不同的编译器可能不同)

只要参数列表不同,在底层处理时会把它当成不同的函数来处理。

注意: 在VS中,当返回值类型不一样时,尽管在底层处理时名字不一样,也不能形成函数重载(可能是以前编译器没有考虑到这一点)。

(2)在c++中,如何按照c语言的风格来编译?
          答:在函数名前面加 extern “C”

extern "C" int Add(int left, int right);//按照c语言的风格编译
int main()
{
 Add(1, 2);
 return 0;
}

以上代码即使在C++工程下,也是按照C语言编译的。

全部评论

相关推荐

HR_丸山彩同学:你的项目描述里,系统设计讲了很多:MemCube是什么、三级存储架构怎么设计、四种遗忘策略分别是什么。这些面试的时候讲没问题,但简历上不需要这么细。 简历要突出的是影响力,不是实现细节。面试官看简历的时候想知道的是「这个项目有多大价值」,不是「这个项目具体怎么实现的」。实现细节是面试时候聊的 怎么改:技术细节可以精简为一句「采用三级存储架构+四种遗忘策略」,把省出来的篇幅用来写影响力。比如:项目有没有开源?有没有写成技术博客?有没有被别人使用过? 校园经历没有任何信息量,任何人都可以写这句话,写了等于没写。更关键的是,你投的是技术岗,校园活动经历本来就不是加分项。如果非要写,必须写出具体的数字和成果。如果你没有这些数字,那就老老实实删掉 「端到端耗时缩减30-40%」要给出确切数字和绝对值。从1000ms降到600ms是降了40%,从100ms降到60ms也是降了40%,但这两个含义完全不一样。其他也是,涉及到数据,准备好证据,口径统一,面试会问 「熟练」「熟悉」「了解」混在一起用,读起来很乱。而且「了解前端需求」最好改成「具备前后端协作经验」
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务