C++ 区别于C的一个重要概念就是C++是面向对象的,C是面向过程的。其中重载(overload)是C++仅有的一种特性,依赖于C++编译器。重载一般发生在函数之上,重载可以出现在我们前面学习的三种函数:普通函数,友元函数,成员函数。另外重载还可以发生的运算符之上。下面分别解说如下:
【1】函数重载 同名但是不同参数类型或者参数个数的函数,叫函数重载。从这个定义里我们要需要注意以下几点:重载发生在一个作用域范围之内,或者一个文件之内,但是重载不会发生在两个不同作用域范围内,比喻说成员函数与普通函数同名,不算重载,普通函数与成员函数之间就不算重载。
【2】运算符重载 运算符的本质上是函数,这一点从编译的实现角度是一样的。因此,C++充分利用了这个特性,当两个对象需要相互比较运算时,系统默认定义的运算符肯定不能支持,比喻说3+5=8但是两个自定义 的类的对象相加该怎么计算呢?没有现成的规则,这就需要进行运算符重载。运算符重载需要想到的就是在什么地方写这个重载函数,一种在类作用之外,将这个重载函数作为普通函数,另一种是在类之内,作为一个成员函数。格式 函数类型 operator运算符()
【3】自增运算符重载 自动运算符++在使用时变量的值与表达式的值在一种情况下会不一样。如++a是一样,但a++则不一样。
前面讲了重载的一些相关知识,这里需要提醒一点,就是重载是一种思想,不能为了重载而重载,重载需要编译器进行识别,一旦识别错误,就会导致整个程序失败。因此,重载的基本思路是要让编译器很容易识别你重载的当前函数或者运算符,不要引起误会,这一点在高质量编程中提到一个例子就是参数个数相同,但类型可以进行自动转型时,如果入参被自动转型就麻烦了。最后还要强调一点C++设计重载跟面向对象有多少关系吗?其实重载跟对象还真没有多少关系,那为什么C不实现呢?我们知道C是一种最精简的语言,最接近汇编的语言。C++引入的重载最终都要转化成汇编,汇编是不知道重载的,都要进行一个一个函数识别的,通常是在汇编时自动重命名成不同的函数名称。