运算符重载、组合与继承、虚函数与多态性学习总结

C++语言定义了大量的运算符,使得程序员能够编写出形式丰富的表达式。运算符重载提供了一种语法上的方便,用户可以为自己的类型定义运算符函数,并通过运算符对类对象进行操作。当运算符被用于类类型的对象时,重载的运算符为其指定了新的含义。
运算符和普通函数在使用的语法上虽然有所不同,但是可以将运算符看作是一种特殊的函数:操作数是函数的参数,运算结果是函数的返回值。运算符如果可以被看作是函数,自然也可以像函数一样重载。在C++中,可以为一个类类型定义运算符,和普通函数的定义形式很相似,只是函数的名字是关键字operator后紧跟要重载的运算符。
重载的运算符具有特殊的名字,由关键字operator和其后要定义的运算符共同组成。和其他函数一样,重载的运算符也包含返回类型,参数表以及函数体。运算符函数的参数个数取决于以下两个因素:
(1)运算符的操作数个数,即是一元运算符还是二元运算符;
(2)运算符函数是成员函数还是非成员函数。
将运算符函数定义为成员函数时,调用成员函数的对象(this指向的对象)被作为运算符的第一个操作书,所以对一元运算符函数无须再提供参数。使用成员函数重载二元运算符时,将当前对象(this指向的对象)作为左操作数,只需要提供一个参数作为右操作数。
如果将运算符函数定义为非成员函数,重载一元运算符时需要提供一个类类型的参数,重载二元运算符时需要提供两个参数,分别作为左、右操作数,其中至少一个参数必须是类类型的。
运算符重载仅仅提供了一种语法上的方便,是以另外一种方式调用函数而已。从这个角度看,不能滥用运算符重载,只有在能使类的代码更易读、使类对象的操作方式更符合一般习惯时,才重载运算符。C++中有些运算符不能被重载:作用域解析符(::)、成员选择符(.)、成员指针间接引用符(.*)和条件运算符(?:)。
重载输入输出运算符
重载的operator>>运算符函数原型如下:
istream& operator>> (istream&, type&);
重载的operator<<运算符函数原型如下:
ostream& operator<< (ostream&, const type&);
组合——复用类的实现
对象成员语法也被称作组合或包含。将已有类的对象作为成员,可以通过成员对象使用已有类的功能,复用其实现。类的对象成员与内置类型数据成员的声明语法相同,也可以为对象成员设置访问控制权限。组合是一种简单灵活地复用已有类的方式。如果希望复用一个类的实现,或使用一个类的功能,使用组合是一种简单而有效的方法。在新类中封装一个已有类的对象,让它作为新类实现的一部分去完成相关的操作,实现新类的功能。
继承——复用类的接口
继承是面向对象的核心特征之一,也是一种复用已有类的机制。在已有类的基础上继承得到新类型,这个新类型自动拥有已有类的特性,并可以修改继承到的特性或者增加自己的新特性。在C++中,被继承的已有类成为基类,继承得到的新类成为派生类。派生类可以再被继承,这样构成的层次结构成为继承层次。
派生类继承了基类的数据成员和成员函数,只需要对自己不同于基类的行为或自己扩展的行为编写代码。继承的语法形式如下:
class 派生类名字 :[访问限制符] 基类名字
{
成员声明;
};
定义派生类时可以指定访问限制符public、private或protected。如果不指定,对class关键字定义的类,默认为private,即私有继承;如果是struct关键字定义的类,则默认为public,公有继承。在公有派生类中,基类的public成员和protected成员被继承,分别作为派生类的public成员和protected成员。基类的private成员虽然也被继承了,但在派生类中是不可见的。在私有派生类中,基类的public成员和protected成员被派生类作为自己的private成员继承下来。基类的private成员虽然也被继承了,但在派生类中是不可见的。继承时也可以使用protected限定符,这时基类的public成员和protected成员都被派生类作为自己的protected成员继承下来。基类的private成员在protected派生类中仍是不可见的。
继承与特殊成员
(1)禁止继承的类
如果不希望一个类被其他类继承,可以在类名后跟一个关键字final,防止该类被继承。
(2) 不能自动继承的成员
构造函数;
析构函数;
赋值运算符函数。
(3)复用基类的构造函数
C++11中允许派生类复用其直接基类的构造函数,有时也被称为继承基类的构造函数。派生类复用基类构造函数的方式是在派生类定义中提供一条using声明:
class Derived :public Base {
using Base::Base; //继承Base的构造函数
}
(4)静态成员的继承
如果基类定义了一个static成员,则在整个继承层次中只存在该成员的唯一定义。不论从基类派生出来多少个派生类,对于每个静态成员来说都只存在唯一的实例。静态成员遵循一般的访问限制规则:如果基类中的成员是private的,则派生类无权访问。
如果派生类没有重新定义基类接口中的操作,那么当派生类对象接收到相应的消息时会调用基类操作进行处理。派生类也可以重新定义基类接口中的同名操作,以不同于基类的方式来处理接收到的消息。重定义的方式有如下两种。
(1)在派生类中重定义基类接口中的成员函数,参数表和返回类型保持与基类中一致,这种情况称为覆盖
(2)在派生类中重定义基类接口中的成员函数,并改变了函数的参数表或返回类型,这种情况称为隐藏
虚函数与多态性
在C++语言中,基类将两种成员函数区别开来:一种是基类希望派生类覆盖的函数,另一种是基类希望派生类直接继承而不要改变的函数。对于前者,基类将其定义为虚函数
声明虚函数:基类在成员函数声明语句之前加上virtual关键字使得该函数执行动态绑定。语法形式为:
virtual 返回类型 成员函数(参数表)
动态绑定只对虚函数起作用,并且只有在使用含有虚函数的基类地址(指针或引用)调用时发生。虚函数在基类中用virtual关键词声明,virtual只能在类内的成员函数声明之前,不能用于类外的函数定义。除了构造函数之外,任何非静态成员函数都可以是虚函数。派生类中可以重定义基类的虚函数,这称为覆盖。
实现多态性的步骤
(1)在基类中将需要多态调用的成员函数声明为virtual;
(2)在派生类中覆盖基类的虚函数,实现各自需要的功能;
(3)用基类的指针或引用指向派生类的对象,通过基类指针或引用调用虚函数。
需要注意的是,只有通过基类的指针或引用才能实现虚函数的多态调用,通过对象调用虚函数不会有多态性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值