C++基础-函数重载

函数重载

一组函数,函数名相同,参数列表个数或类型不同,那么这一组函数称作函数重载

C++为什么支持函数重载,C语言不支持函数重载

  • 编译器编译代码产生符号的规则是不同的:
  • C++代码产生函数符号的时候,是函数名+参数列表类型组成的
  • C代码产生函数符号时,只由函数名决定
  • 如果把此cpp 代码放入c中 会产生编译链接错误

函数重载需要注意

bool compare(int a, int b){ //compare_int_int
	cout<<"compare_int_int"<<endl;
	return a>b;
}

bool compare(double a, double b){ //compare_double_double
	cout<<"compare_double_double"<<endl;
	return a>b;
}

bool compare(const char* a, const char* b){ //compare_const char*_const char*
	cout<<"compare_char*_char*"<<endl;
	return strcmp(a,b)>0;
}

int data = 10;
int main(int argc, char const *argv[])
{
	int data = 20; 
	int a = ::data; //全局作用域的data

	//在函数中局部声明另一个函数
	bool compare(int a, int b);

	compare(10,20);
	compare(10.0,20.0);  //double => int
	compare("aaa","bbb"); //const char* => int ??
	return 0;
}

我们在全局有三个函数的定义,在main()中局部声明一个函数,调用时会就近采用当前作用域的声明,因此在上述情况下,不在同一个作用域就谈不上重载

一组函数要称得上重载,一定是先处在同一个作用域当中的

const或者volatile的时候, 是怎么影响形参类型的

volatile : 解决多线程程序内存可见性的一个必不可少的关键字

#include <typeinfo> //获取类型信息

void func(int a){}
//void func(const int a){} //const int与 int 属于同一函数参数

void func(int *a){}
//void func(int *const a){} //同一函数
void func(int const* a){} //不同函数

int main(int argc, char const *argv[])
{
	int a = 10;
	const int b = 10;
	cout<<typeid(a).name()<<endl; //int
	cout<<typeid(b).name()<<endl; //int
	
	return 0;
}

注意:

一组函数,函数名相同,参数列表也相同,仅仅是返回值不同不叫重载(符号是依据函数名+形参列表决定的,生成符号和返回值没有关系)

面试题:请解释一下什么是多态?
一个事物的多种形态
静态多态(编译时):函数重载(编译时生成指令时,需要经过实参的入栈,call函数)
动态多态(运行时):虚函数

C++和C语言代码之间互相调用

C++ 调用 C

//test.c
int sum(int a, int b)// sum  .text
{
	return a+b;
}
//test.cpp
//无法解析外部符号 C++生成的符号无法匹配C生成的符号的定义
int sum(int a, int b); //sum_int_int "UND"
int main(int argc, char const *argv[])
{
	int ret = sum(10,20);
	return 0;
}

结论:无法直接调用

解决方法:把C函数声明扩在 extern "C" 里面

extern "C"{ //以C语言规则生成符号,链接的时候就可以找到test.c符号定义
	int sum(int a, int b); 
}

C 调用 C++

反过来同样,无法直接调用,因为符号不匹配

解决方法:把C++函数定义扩在 extern "C" 里面, 按照C语言规则生成

extern "C"{
	int sum(int a, int b)// sum_int_int  .text
	{
		return a+b;
	}
}

灵活的函数定义

//只要是C++编译器, 都内置了__cplusplus这个宏名
#ifdef __cplusplus //在CPP中宏生效,这个函数是按C规则生成
extern "C"{
#endif

	//如果用C编译器,不认识__cplusplus这个宏,直接生成的就是C符号
	int sum(int a, int b)// sum_int_int  .text
	{
		return a+b;
	}

#ifdef __cplusplus
}
#endif

因此这样写,不管什么编译器,在C中都是可以直接调用

posted @ 2022-07-13 17:36  言叶以上  阅读(46)  评论(0编辑  收藏  举报