一、什么是函数重载呢?
比如我们要实现一个swap函数
int swap(int* x, int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
但是这个函数只能实现俩个整形的交换,我们想要实现俩个char类型的交换,就要使用下面这个函数
void Swap(char* x ,char* y);
以上俩个函数即构成重载;
函数重载方便我们将函数的名字统一起来,用户可以通过这个函数名调用不同类型的同名函数,而程序员也不需要记更多的函数名。
二、函数重载的基本概念:
1. 在同一作用域内;
2. 函数名相同
3. 参数列表不同(参数类型不同,参数个数不同,参数的顺序不同)
注:1 .俩个函数构成重载,与返回值类型无关
2. c语言不支持函数重载,c++支持
三、为什么c++支持重载,而C语言不支持重载呢 ?
答:这与函数在编译过程中的命名规则有关
c语言:编译时编译器对函数名的修改规则是:在名字前面加_
eg : void Swap (int* x , int* y); ——改为 _Swap
void Swap (char* x, char* y); ——改为 _Swap
c++中:函数的命名规则 ?+函数名+@@YA+参数列表+@Z
eg:void Swap (int* x , int* y); ——改为 ?Swap@@YAXHH@Z
void Swap (char* x , cahr* y); ——改为 ?Swap@@YAXDD@Z
X-void D - char F - short H - int J-long
所以编译器认为他们的函数名是不一样的,故可以重载
四、为什么在c++中调用c语言的函数要用 extern”c“?
因为在编译期间,c和c++编译器对函数进行重命名,且命名规则不同,使用extern ”c“的方式在C++程序中声明c语言文件中的函数,可以在编译时告诉编译器使用c语言是规则对该函数进行命名。这样在链接的时候就可以顺利的在.c文件中找到该函数
五、名字空间域
名字空间域是标准c++中进入的,他解决了全局命名的冲突;在c++中,变量,函数,类都是大量存在的,如果这些函数,变量,类的名字都存在与全局命名空间中,很可能会导致一些冲突,所以我们引入了名字空间域。它是我们的名字都本地化,避免命名冲突或名字污染
1、形式:
1).以namespace关键字开头
2) 域名
3) 用花括号括起来内容
4)可以使用 using namespace 域名 / 域名 : : 变量名(函数)的方式使用域内成员
namespace Name1
{
int a = 0;
}
namespace Name2
{
int a = 1;
}
Name1::a = 10;
Name2::a = 20;
2、名字空间域可以镶嵌使用
3、同一名字空间域可以放在不同的文件下,编译器在编译过程中会合成同一命名空间下
从本质上讲,名字空间与就是定义了一个范围,名字空间域里的任何东西都局限于该命名空间。