封装继承和多态是面向对象三大基本支柱。
在面向对象系统中有两种编译方式:静态联编和动态联编
静态联编:也叫早期联编:指系统在编译时就决定如何实现某一动作,提供了执行速度快的优点。
动态联编:也叫滞后联编:指系统运行时动态实现某一动作,它提供了灵活和高度问题抽象的优点。
C++ 支持两种多态性:编译时的多态性和运行时的多态性。
编译时的多态性通过重载来获得,而重载有包含函数重载和运算符重载。
运行时的多态性通过使用继承和虚函数来获得。
===================================运算符重载=============================================
1.运算符重载有何意义?
当你定义一个新的Class的时候,同时需要定义能够作用他的操作,这时就需要运算符重载来实现:
比如: class A{.....};
A b ,c d;
d = b+c;//编译时报错,因为并没有定义关于类型A的+操作。
A A::operator+(A f){};
d= b+c;//这样就对了
//其实,如果觉得不习惯,完全可以编写函数来实现相关操作,并调用函数。比如;d=b.add(c);
运算符重载实际上是一个特殊函数的重载,本质上任何一个运算符底层还是一个函数。
运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生
2.C++中除了以下五个运算符不能重载剩余都可以重载:
成员访问符:“.”
作用域运算符:“::”
条件运算符:“ ? : ”
成员指针运算符:“*”
编译预处理命令的开始符:“#”
3.运算符重载时需要注意的问题:
运算符的优先级和结合性不能改变
程序员并不能创造出新的运算符
重载功能与原功能类似,而且,不能改变运算符操作数据的个数,至少有一个操作数是自定义类型的操作数。
4.运算符重载有两种形式: 以成员函数的形式,以友元函数的形式
--------------> 成员函数的重载:<-----------------------------
注意:若重载的运算符为一元的那么参数列表为空,如果为二元的那么参数列表中有一个操作数。以此类推。
operator是运算符重载中必不可少的关键字。
比如:String operator+(const String &a);class内申明
String String::operator(const String &a){....};体外定义
String demo3 = demo1+demo2;<==等价于==>String demo3=demo1.operator+(demo2);
//详细代码参见:书籍P125~129《课本》。
--------------->友元函数的重载<-----------------------------------
友元函数与成员函数 的重载最大的区别在于:参数列表个数的不同
友元函数不属于任何一个类,故没有this指针,所以它重载运算符时:运算符为一元的那么参数列表里需要一个
操作数,为二元时那么需要两个参数。
友元运算符的重载可以返回任何一个类型,但是通常返回与它的操作类型相同的类型。
注意:有些运算符我们既可以采用成员函数的形成重载当然也可以以友元函数的形式重载,但是有一种情况只能使用友元函数来进行重载:
当运算符的左操作数是一个常数时,不能利用this指针,就必须使用友元重载。
5.常见运算符的重载:
注意前自增和后自增表达式的区别:
price operator++()//这是前自增
price operator++(int)//这是后自增