c++复习(八)

       **第八章                    运算符重载*

多态性:操作接口具有表现多种不同形态的能力,在不同环境下对不同的对象具有不同的处理方式,通过绑定实现,编译是的绑定称为早绑定,运行时绑定是等到运行时才把标识符和程序代码结合起来。

c++几乎可以重载全部运算符,而且只能重载c++里已有的,不能重载:".",".*","::”,"?:",重载之后运算符的结合性和优先级都不会改变。

重载为类的非静态成员函数,或者非成员函数

双目运算符重载为成员函数:
函数类型 operator 运算符(形参)
{

}
参数个数=原操作数个数-1(后置++,–除外)

规则:
如果要重载B为类成员函数,使之能够实现表达式oprd1 B oprd2,其中oprd1为A类对象,则B应该被重载为A类成员函数,形参类型应该是oprd2所述的类型,经重载后,表达式oprd1和oprd2相当于oprd1.operator B(oprd2)
例题:
将加减运算重载为附属类的成员函数,实部和虚部分别相加减,两个操作数都是附属类的对象。

单目运算符重载为成员函数
如果要重载U为类成员函数,使之能够实现表达式U oprd,其中oprd为A类对象,则A应该被重载为A类的成员函数,无形参,U oprd相当于oprd.opertator U()
后置单目运算符++和–重载规则,如果要重载++或–为类的成员函数,使之能够实现表达式oprd++或者oprd–,其中oprd为A类对象,则++或者–为A类得成员函数,具有一个int的参数。
经过重载后,表达式为oprd++相当于oprd.oprator ++(0)

将运算符重载为非成员函数
函数的形参代表依自左至右次序排列的各操作数
重载为非成员函数时,参数个数=原操作数个数(后置++,–除外),至少应该有一个自定义类型的参数,后置单目运算符++和–的重载函数,形参列表中要增加一个int,但不必写形参名,如果在运算符的重载函数中需要操作某类对象的私有成员,可以将此函数声明为类得友元。

虚函数:
实现动态绑定的函数,用vitural关键字说明的函数,虚函数是实现运行时多态性的基础,c++中的虚函数是动态绑定的函数,虚函数必须是非静态的成员函数,虚函数经过派生之后,就可以实现运行过程中的多态,构造函数不能是虚函数,析构函数可以是虚函数。

声明:virtual 函数类型 函数名(形参名)
虚函数声明只能出现在类定义中的函数原型声明中,而不能在成员函数实现的时候,在派生类中可以对基类中的成员函数进行覆盖,虚函数一般不声明为内联函数,因为对虚函数的调用需要动态绑定,而内联函数的处理时静态的。

虚析构函数:如果打算允许其他人通过基类指针调用对象的析构函数(通过delect这样是正常的),就需要让积累的析构函数成为虚函数,否则执行delete的结果是不确定的。

虚表与动态绑定:
虚表:每个多态类有一个虚表(virtual table),虚表中有当前类的各个虚函数的入口地址,每个对象有一个指向当前类的虚表的指针,(虚指针vptr)
**动态绑定的实现:**构造函数中为对象的虚指针赋值,通过多态类型的指针或引用调用成员函数时,通过虚指针,找到虚表,进而找到所调用的虚函数的入口地址;通过该入口地址调用虚函数

抽象类:
纯虚函数:在基类中声明的虚函数,它在基类中没有定义具体的操作内容,要求各派生类根据实际需要定义自己的版本
声明:virual 函数类型 函数名(参数表)=0;
有纯虚函数的类叫做抽象类
语法:class 类名
{
virtual 类型 函数名(参数表)=0;
//其他成员
}

抽象类的作用:
将有关的数据和行为组合在一个继承层次结构中,保证派生类具有要求的行为,对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现,抽象类只能作为基类使用,不能定义抽象类的对象。

override:
多态行为的基础:基类声明虚函数,派生类声明一个函数覆盖该虚函数,覆盖要求:函数签名完全一致
函数签名:函数名 参数列表 const

final:这个类可以被继承,但是程序不能被修改,不能被覆盖

在特定的地方有特定的含义,不要随便使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章