栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++小知识06 —— 函数重载

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++小知识06 —— 函数重载

什么是函数重载

我们先来看一下什么是函数重载

#include
using namespace std;

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

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

bool  compare(const char * a,const char * b)
{
	cout << "there is compare_char_char" << endl;
	return a > b;
}

int main()
{
	compare(1, 2);
	compare(1.0, 2.0);
	compare("aaa", "bbb");

	system("pause");
	return 0;
}

我们可以看到我们定义了三个同名函数,三个函数的返回值类型相同,函数名相同,但是函数参数不同,此时我们可以得出结论:一组函数中,函数名相同,返回值相同,参数列表的个数或者类型不同,那么这组函数就称为函数的重载

我们来看一下这段代码,这里我只展示主函数,函数的定义就用之前的

int main()
{
	bool  compare(int a, int b);
	bool  compare(const char* a, const char* b);
	compare(1, 2);
	compare(1.0, 2.0);
	compare("aaa", "bbb");

	system("pause");
	return 0;
}

再来看看它的输出是什么

 为什么compare(1.0,2.0)的输出是there is compare_int_int呢,因为函数重载它还有一个条件就是在同一个作用域内。之前我们把函数定义写在全局的,所以他会自动根据传递的参数进行匹配,但是我们在main函数声明一下,他会优先去看声明了那些函数,并根据声明的函数去判断所传的参数需要调用那个函数,而不是去全局区域去看定义了那些函数。

所以第二个结论:一组函数要称得上重载,就一定是处在同一个作用域之中的。

再来看看这个

#include
using namespace std;

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


int main()
{
	bool  compare(int a, int b);
	compare(1, 2);

	system("pause");
	return 0;
}

这个代码算不算函数重载呢,其实是不算的,如果要探究它为什么不算函数重载,我们要用typeinfo头文件来查看一下它的类型

#include
#include
using namespace std;

int main()
{
	int a = 10;
	const int b = 10;
	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;

	system("pause");
	return 0;
}

输出结果是 

 所以当参数加上const或者volatile的时候,他们的参数类型还是原来的,const和volatile只是给参数类型进行一个修饰,所以int 和 const是一样的。

此时得出结论三:参数加上const或者volatile修饰时,是不影响它的参数类型的

函数重载需要注意些什么

在函数中定义一个函数是不允许的,但是可以在函数中声明一个函数,这个在我们的第二段代码就可以看出

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

再说这个问题之前,我还有个问题,就是C和C++都支持函数重载吗?

答案是否定的,C代码是不支持函数重载的。

因为在C++中,代码产生函数符号的时候,是函数名+参数列表类型组成的

而在C中,代码产生函数符号的时候,只由函数名来决定,如果用函数重载会造成链接错误。

现在我们来说一下两种语言的相互调用

C调用C++:在C++文件中,把C++的代码放在extern "C" {   } 的大括号中

C++调用C:在C++文件中,把C的代码放在extern "C"{   }的大括号中

如果分不清楚,嫌麻烦,那么我们可以这样写

#ifdef __cplusplus
extern "C"{
#endif
    int sum(int a, int b)
    {
        return a + b;
    }
#ifdef __cplusplus
}
#endif

只要是C++编译器,其内部都内置了__cplusplus这个宏,而这段代码不管是用C还是用C++编译器生成,都是可以直接给其他的C项目调用

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938477.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号