C++高级特性——重载

来源:互联网 发布:小米高清网络机顶盒 编辑:程序博客网 时间:2024/05/12 14:30

C++作为一个面向对象的语言(虽然不是完全的面向对象,和C#与Java这样的完全面向对象语言比较可得,说这个不表达语言之争,勿喷)。C++的高级特性具备了OO的三个(封装,继承,多态),当然OO的这三个并不仅仅是C++拥有的特性,而是具备面向对象的思想的语言都具备的,这里请注意是面向对象的语言,这一点很重要。因为只有支持继承与多态的才算是面向对象,而C语言的结构体所体现出来的封装特性仅仅算上是基于对象的。当然C++除了OO的三个之外还有相对于C语言的高级特性,那就是内联,重载,模板(也就是泛型的基础),const,virtual。这些是C语言不具备的,可能有人问C的int printf(const char *Format,...)怎么不算重载呢?他分明是可以接受不同类型参数的。C语言的printf()一系列函数他们有一个其他的名词形容,那就是"变长参数"函数。具体请看这个链接:点击打开链接。

重载定义:

接下来看百度给出的重载定义:

函数重载要求编译器能够唯一地确定调用一个函数时应执行哪个函数代码,即采用哪个函数实现。确定函数实现时,要求从函数参数的个数和类型上来区分。这就是说,进行函数重载时,要求同名函数在参数个数上不同,或者参数类型上不同。否则,将无法实现重载

两个或两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数进行最佳匹配,自动确定调用哪个函数,这就是函数的重载。

PS:别忘了,重载也是多态的一种表现形式,重载在多态的概念中也称之为静态多态,就是在编译阶段就确定了执行那段函数代码段。每一个函数名都是一个地址,这个地址是函数的代码段入口地址。对用户来说重载的函数是具有相同的函数名的,但是对于计算机来说还是每个函数有独立的存储区域。

重载的语法规则:

上面说到,编译器是根据函数的参数列表的差异来唯一确定要调用的函数的。这里的区别包括参数个数的不同,参数类型的不同。这是因为编译器在进行语法检测的阶段对函数的参数列表检查就仅仅是参数个数与参数类型,另外值得一说的是仅仅是函数返回类型不同是不引起重载的,而且会被编译器认为是重定义。

一:普通参数下(这里的普通是指非指针&&非引用)

1参数个数不同引起的重载:

void Fun(int i);

void Fun(int i,int j);  //符合重载

2参数类型不同引起的重载:

void Fun(int i);

void Fun(float f);  //符合重载

3参数的个数与类型的结合并且不一致

void Fun(int i);

void Fun(int i,float f);

4一个const,一个不是:

void Fun(int i);

void Fun(const int i);  //这种情况下是不能符合重载的,编译器反而当做重定义错误。

二:非普通参数下(参数中包含指针或是引用)

1在const与引用一起使用时:

void Fun(const int &ri);

void Fun(int &ri);  //符合重载

2在const于指针一起使用时:

void Fun(const int *ip);等价于void Fun(int const *ip);  参看笔者的另一篇博客:点击打开链接

void Fun(int *ip);  //符合重载

三:特别的类成员函数下

void Fun(参数列表一致);

void Fun(参数列表一致)const;

const对象或是const指针或是const引用调用的是后者带有const的函数,而普通的对象或是指针或是引用调用的是前者不带const的。


原创粉丝点击