1、重载和覆写之间的区别:
重载(overloading)是指同一个函数的不同版本之间参数不同,重载可以有函数重载和运算符重载。
覆写(overriding)是指子类改写父类的方法或称重写,覆盖。
(1)重载
重载是编写一个与已有函数同名但参数列表不同(参数类型或参数个数不同)的方法,具有以下特征:
- 方法名必须相同
- 参数列表必须不同,与参数列表的顺序无关
- 返回值类型可以不同,但就两个函数的返回值而言,不足以区分两个函数是否重载。
(2)覆写
覆写是派生类重写基类的虚函数;具有以下特征:
- 只有虚函数和抽象方法才能够被覆写
- 具有相同的函数名
- 具有相同的参数列表
- 具有相同的返回值类型
(3)重载是一种语法规则,是由编译器在编译阶段完成,不属于面向对象编程;而覆写是由运行阶段决定的,是面向对象编程的重要特征。
2、运算符重载
C++中允许类的对象构造运算符实现单目或双目运算,这种特性就叫运算符重载。对于每一个运算符@(注意:"?: "," . ", ".* ", "::","sizeof”这五个运算符不能重载),在C++中都对应一个运算符函数operator@(@此处表示C++中的各个运算符)。运算符重载函数的一般原形为:
type operator@(arglist)
其中type为运算结果类型,arglist为操作数列表。
对于不同的情况要进行不同的运算符重载:
- 在定义的对象间相互赋值时,重载赋值运算符;
- 在数字类型增加算术属性时,重载算术运算符;
- 为定义的对象进行逻辑比较时,重载关系运算符;
- 对于容器(container),重载下标运算符[];
- 从I/O流读写对象时,重载“>>”和“<<”运算符;
- 实现smart指针时,重载成员指针运算符“->”;
- 在少数情况下重载new,delete运算符。
运算符重载需要遵循以下规则:
- 重载的运算符不能违反语言的语法规则;
- 如果一个运算符可以放在两个操作数之间,就可以重载它来满足类操作的需要,即使这种用法原本为编译器所不能接受的;
- 不能创造C++中没有的运算符;
- 重载时不能改变运算符的优先级。