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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dreamispossible/article/details/83448287

缺省参数概念:

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

举例说明

#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++允许在同一作用域中申明几个功能类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序 )必须不同,常用来处理实现功能类似数据类型不同的问题。

如下图代码:

扫描二维码关注公众号,回复: 4311766 查看本文章
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语言编译的。

猜你喜欢

转载自blog.csdn.net/dreamispossible/article/details/83448287