C++学习笔记(函数重载、extern、默认参数)

函数重载

定义
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;
}
  • 默认参数的值可以是常量、全局符号(全局变量、函数名)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容