函数重载
定义
1、函数名相同
2、参数个数不同,参数类型不同,参数顺序不同
代码实例如下:
#include <iostream>
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 <iostream>
using namespace std;
void dispaly(long a){
cout << "dispaly(long a)" << a <<endl;
}
void dispaly(double a){
cout << "dispaly(double a)" << a <<endl;
}
int main(int argc, const char * argv[]) {
dispaly(10);
return 0;
}
- 说明:因为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 <stdio.h>
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 <iostream>
#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 <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
int sum(int a, int b);
#ifdef __cplusplus
}
#endif
#endif /* sum_h */
默认参数
C++允许函数设置默认参数,在调用时可以根据实际情况省略实参。
实例如下
#include <iostream>
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 <iostream>
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 <iostream>
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;
}
- 默认参数的值可以是常量、全局符号(全局变量、函数名)