C++语法细微(四)(运算符重载/继承派生)

来源:互联网 发布:算法第四版mobi 编辑:程序博客网 时间:2024/06/04 19:37

运算符重载的方法:
函数类型 operator 运算符名称(形参表列)
{对运算符的重载处理}
函数operator+重载了运算符+
C++不允许用户自己定义新的运算符 只能对已有的C++运算符进行重载
只有5个运算符不能被重载
(.)(成员访问运算符),
(.*)(成员指针访问运算符),
(::)(域运算符),
(sizeof)(长度运算符),
(?:)(条件运算符)
重载不能改变运算符对象(即操作数)的个数
重载不能改变运算符的优先等级
重载不能改变运算符的结合性
重载运算符的函数不能有默认的参数
重载的运算符必须和用户定义的自定义类型的对象一起使用 其参数至少应该是一个类对象(或类对象的引用)
对于类对象的运算符一般必须重载 但是有两个例外 (=)(&)
应当使重载的运算符的功能类似于该运算符作用于标准类型数据时所实现的功能
运算符重载函数可以是类的成员函数 也可以是友元函数 还可以是既非类的成员函数和友元函数的普通函数

先搭框架 逐步扩充 由简到繁 最后完善 边编程 边调试 边扩充

istream &operator >> (istream&,自定义类&);
ostream &operator << (ostream&,自定义类&);
只能将重载<< AND >>的函数作为友元函数或者普通函数 而不能将他们定义为成员函数

隐式类型转换 显式类型转换
提倡的标准写法 类型名(数据)

转换构造函数(conversion constructor function)将一个其他类型的数据转换成一个类的对象
类名(指定类型的数据)
类型转换函数(type conversion function)的作用是将一个类的对象转换成另一种类型的数据
operator 类型名()
{实现转换的语句}
在函数名前面不能制定函数类型 函数没有参数

在已经定义了相应的转换构造函数的情况下 将运算符"+" 重在为友元函数在惊醒两个复述相加时 可以用交换律。
如果将运算符+函数重载为类的成员函数时 交换律不适用 于是 将双目运算符重载为友元函数 单目运算符重载为成员函数

类型转换函数和 运算符重载以及转换构造函数相矛盾

继承(inheritance)和派生
BaseClass FatherClass DerivedClass SonClass
Multiple Inheritance
派生类是基类的具体化 基类是派生类的抽象
class DerivedClassName : [inheritMethod] BaseClassName
{Derived Class Implement};
保护派生类(protected derived class)

在执行派生来的构造函数是 调用基类的构造函数是一个继承里面用到的好的方法
派生类构造函数名(总参数表列):基类构造函数名(参数表列)
{派生类中新增数据成员初始化语句}

执行派生类构造函数的顺序:
调用基类构造函数 对基类的数据成员初始化
调用子对象构造函数 对子对象数据成员初始化
再执行派生类构造函数 对派生类数据成员初始化

在执行派生来的析构函数的时候 系统会自动调用基类的析构函数和子对象的析构函数
先执行派生类自己的析构函数 对派生类新增加的成员进行清理 然后调用子对象的析构函数
对子对象进行清理 最后调用基类的析构函数 对基类进行清理。

多重继承:
class D : public A, protected B, private C
{类D增加的成员};

派生类的构造函数名(总参数列表):基类1构造函数(参数表列),基类2构造函数(参数表列),基类3构造函数(参数表列)
{派生类中构造函数体}
先调用基类的构造函数,调用顺序是按照声明派生类时基类出现的顺序
多重继承会产生二义性,需要加类名来限制说明具体是哪个成员

虚基类:
虚基类声明并不是在生命基类时声明的而是在声明派生类时 指定继承方式时声明的。
class 派生类名:vritual 继承方式 基类名
最终派生类在构造函数初始化的时候需要调用虚基类的构造函数 ,并且直接派生虚基类的派生类不会再调用

在一个类中以另一个类的对象作为数据成员称为类的组合。

原创粉丝点击