c语言 参数类型重载,C++学习笔记(函数重载、extern、默认参数)

函数重载

定义

1、函数名相同

2、参数个数不同,参数类型不同,参数顺序不同

代码实例如下:

#include

using namespace std;

//a

int sum(int a,int b){

return a+b;

}

//b

int sum(int a,int b, int c){

return a+b+c;

}

//c

int sum(int a,double b){

return a-b;

}

int main(int argc, const char * argv[]) {

//1

cout << sum(10, 11) << endl;

//2

cout << sum(10, 2.5) << endl;

//3

cout << sum(10, 11, 12) << endl;

return 0;

}

//1调用函数//a

//2调用函数//c

//3调用函数//b

输入结果如下:

21

7

33

Program ended with exit code: 0

注意:

1、 返回值类型与函数重载无关

2、调用函数时,实参的隐式类型转换可能会产生二义性

例如以下重载就会产生二义性

#include

using namespace std;

void dispaly(long a){

cout << "dispaly(long a)" << a <

}

void dispaly(double a){

cout << "dispaly(double a)" << a <

}

int main(int argc, const char * argv[]) {

dispaly(10);

return 0;

}

67b1e3911038?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

报错

说明:因为dispaly(10)参数为int类型,而重载函数参数为long类型或者double类型,实参隐式类型转换时就有多种选择而不能转换

函数重载的本质

采用了name mangling或者叫name decoration技术

c++编译器默认会对符号名(变量名、函数名等)进行改编、修饰,有些地方叫“命名倾轧”。

重载时会生成多个不同的函数名,不同编译器(MSVC、g++)有不同的生成规则

extern

被extern “C”修饰的代码会按照C语言的方式去编译

由于C、C++编译规则的不同,在C、C++混合开发时,C++在调用C语言API时,需要使用extern "C"修饰C语言的函数声明。

实例如下,首先我们创建C语言的sum文件:

sum.h文件

#ifndef sum_h

#define sum_h

#include

int sum(int a, int b);

#endif /* sum_h */

sum.c文件

#include "sum.h"

int sum(int a, int b){

return a+b;

}

当我们在C++文件中调用的时候,就会failed

#include

#include "sum.h"

using namespace std;

int main(int argc, const char * argv[]) {

cout << sum(11, 12) << endl;

return 0;

}

报错如下

Showing Recent Messages

/clang:-1: linker command failed with exit code 1 (use -v to see invocation)

这是因为C++和C的函数在编译器上编译方式不同,所以C++不能找到C的函数。

解决办法如下

在引用C语言的头文件时,C语言的.h文件中,在函数前面加上extern "C",这样,在C++调用C语言的函数,就会按照C语言的函数方式调用函数。

#ifndef sum_h

#define sum_h

#include

#ifdef __cplusplus

extern "C" {

#endif

int sum(int a, int b);

#ifdef __cplusplus

}

#endif

#endif /* sum_h */

默认参数

C++允许函数设置默认参数,在调用时可以根据实际情况省略实参。

实例如下

#include

using namespace std;

void func(int a = 20){

cout << "func(int a) = " << a << endl;

}

int main(int argc, const char * argv[]) {

func();

func(10);

return 0;

}

输出值

func(int a) = 20

func(int a) = 10

Program ended with exit code: 0

如果下面这句代码,参数没有默认值,则函数func()调用会报错;

void func(int a = 20)

注意点

默认参数只能按照右到左的顺序

#include

using namespace std;

void func(int a , int b = 20){

cout << " a = " << a << endl;

cout << " b = " << b << endl;

}

int main(int argc, const char * argv[]) {

func(10);

return 0;

}

如果默认参数是a=20,则会报错

如果函数同时有声明、实现,默认参数只能放在函数声明中

#include

using namespace std;

void func(int a = 5 , int b = 8);

void func(int a , int b ){

cout << " a = " << a << endl;

cout << " b = " << b << endl;

}

int main(int argc, const char * argv[]) {

func(10,20);

return 0;

}

默认参数的值可以是常量、全局符号(全局变量、函数名)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值