c++函数的高级特性:重载
重载和内联可以可用于全局函数和类成员函数;
重载:将语义,功能相似,作用域相同的几个函数用同一个名字表示。
c++中类的构造函数需要重载机制。
重载的实现方法:
函数名称相同,参数不完全相同,参数可能在种类,数量,顺序上等有所不同,
在参数完全相同而返回值不同的情况下,编译器就不知道该调用哪个,所以这是一种二义性,而不是重载。
编译器根据参数为每个重载函数产生不同的内部标识符,
例如:
void eat(beef bvalue)的标识符为_eat_beef或别的风格,依据编译器的不同可能会产生不同的函数标识符。
c++程序要调用已经被编译过的c函数时(就是静态库和动态库)
例如:c语言下的函数声明void foo(int x, int y);
该函数在c编译器编译后在库中的名字为_foo,而在c++编译器中则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,c++程序不能直接调用c函数。
c++提供了一个c连接交换符extern "C"来解决这个问题。
例如:
extern "C"
{
void foo(int x, int y);
//其他函数
}
extern "C"
{
#include"mtheader.h"
//其他c头文件
}
通过extern "C"语句告诉编译器,函数foo是个c连接,应该到库中找名字_foo而不是_foo_int_int。
c++编译器开发商已经对c标准库的头文件做了extern "C"处理,所以我们才可以直接include这些头文件。
全局函数和类成员函数同名不算重载,因为作用域不同。
如果类的某个成员函数需要调用全局函数而同时拥有与全局函数重名的成员函数时,为了显示与成员函数的区别,需要在全局函数前加’::'标志。
::print(…);//表示print时全局函数而非成员函数。