c++知识总结

运算符重载
类比函数重载:把运算符看做特殊的函数,操作数是函数的参数,运算结果是函数的返回值
函数名:operator要重载的运算符
参数个数取决因素:(1)运算符的操作个数(一/二元运算符)
(2)运算符是否是成员函数
{
成员函数:
一元运算符函数不需要提供参数,二元运算符提供一个参数作为右操作数
非成员函数:
一元运算符要提供一个类类型的参数
二元运算符需要提供两个参数分别作为左、右操作数,其中至少一个参数必须是类类型的
通常声明为类的友元,以便访问类的私有数据成员
}
使用范围:当算符是类成员或含有类类型的参数时,运算符函数只有在类类型的对象参与运算时才起作用,当运算符作用于内置类型的运算对象
时,不会改变原来函数的意义
可重载的运算符:
在这里插入图片描述
逻辑与(&&),逻辑或(||),逗号(,),取地址(&)不建议重载
慎用与运算符重载!
一般经验准则:如果类执行I/O 操作,可以定义移位运算符>>和<<
如果类的某个操作是检查相等性,则定义operator==;这时候通常也应该有operator!=
如果类包含内在的单序比较操作,则定义operator<;此时也应该有其他关系操作
重载运算符的返回类型通常情况下应该与内置版本的返回类型兼容
如果类定义了赋值运算符,同时还定义了算术运算符或位运算符,那么最好也提供对应的复合赋值运算符
赋值(=)、下标([])、函数调用(())和成员函数访问箭头(->)运算符必须是成员函数
复合赋值运算符一般应该是成员,但并非必须
改变对象状态的运算符或者与给定类型密切相关的运算符,如自增、自减和解引用运算符,通常应该是成员
具有对称性的运算符可能转换两个操作数中的任何一个,如算术、关系和位运算符等,通常应该是非成员函数
重载移位运算符<<和>>用于对象的I/O 操作时,左操作数是标准库流对象,右操作数才是类类型的对象,只能用非成员函数
非成员运算符和成员运算符之间的选择:
如果没有区别,使用成员运算符,因为这样强调了运算符和类的密切关系
如果左操作数是其他类的对象,或希望运算符的两个操作数都能进行类型转换,则使用非成员函数重载运算符
重载输入输出:istream& operator>>(istream&, type&);
ostream& operator<<(ostream&, const type&);
注:用友元
组合
定义:将一个类对象作为另一个类的成员,称作组合或包含
如果将嵌入的对象作为新类的公有成员,那么除了使用新类接口中提供的功能之外,还可以向包含的成员对象发送消息
如果将嵌入对象作为新类的私有成员,这时它是新类内部实现的一部分:新类中的方法可以使用成员对象提供的功能,但新类只向 外部提供自己的接口,隐藏了包含的成员对象
初始化:
如果没有在初始化列表中对成员对象进行显式初始化,编译器会执行成员对象的默认构造函数,如果成员对象所属的类不存在默认构造函数,会引起编译错误
类中如果包含多个对象成员,在初始化列表中将它们用逗号隔开
成员初始化的次序和成员声明的次序相同,并不考虑它们在初始化列表中的排列顺序
继承
定义:在已有类的基础上继承得到新类型,这个新类型自动拥有已有类的特性,并可以修改继承到的特性或者增加自己的新特性
基类:被继承的类
派生类:继承得到的新类
继承层次:派生类可以再被继承
继承方式:公有继承(public)
私有继承(private)
保护继承(protected)
无论哪种继承,都不能直接使用基类的私有成员
派生类生成:吸收基类成员
改造基类成员
添加派生类新成员
在C++的继承机制中,派生类吸收基类中除构造函数和析构函数之外的全部成员。
改造:通过在派生类中定义同名成员(包括成员函数和数据成员)来屏蔽(隐藏)在派生类中不起作用的部分基类成员。
派生类中访问静态成员:
类名 :: 成员
或 对象名 . 成员
构造:
派生类构造函数声明为
派生类构造函数 ( 变元表 ) : 基类 ( 变元表 ) , 对象成员1( 变元表 )
… 对象成员n ( 变元表 ) ;
构造函数执行顺序:基类 ->对象成员-> 派生类
派生类构造函数和析构函数的使用原则:
类的构造函数和析构函数不能被继承
如果基类没有定义构造函数或有无参的构造函数, 派生类也可以不用定义构造函数
如果基类无无参的构造函数,派生类必须定义构造函数
如果派生类的基类也是派生类,则每个派生类只负责直接基类的构造
派生类是否定义析构函数与所属的基类无关
派生类构造函数的定义:
派生类::派生类名(参数总表):基类名(参数表)
{
// 派生类新增成员的初始化语句
}
赋值兼容规则:
赋值兼容规则指在程序中需要使用基类对象的任何地方,都可以用公有派生类的对象来替代。
赋值兼容规则中所指的替代包括以下的情况:
a 派生类的对象可以赋给基类对象
b 派生类的对象可以初始化基类的引用
c 派生类的对象的地址可以赋给基类类型的指针
选择:
如果多个类共享数据而非行为,应该创建这些类可以包含的共用对象
如果多个类共享行为而非数据,应该让它们从共同的基类继承而来,并在基类里定义共用的操作
如果多个类既共享数据也共享行为,应该让它们从一个共同基类继承而来,并在基类里定义共用的数据和操作
如果想由基类控制接口,使用继承;如果想自己控制接口,使用组合。
虚函数与多态性
虚函数:冠以关键字 virtual 的成员函数称为虚函数
注意: 一个虚函数,在派生类层界面相同的重载函数都保持虚特性
虚函数必须是类的成员函数
虚函数可以是另一个类的友元
析构函数可以是虚函数,但构造函数不能是虚函数
重载要求:函数名、返回类型、参数个数、参数类型和顺序完全相同
析构函数可以是虚的。虚析构函数用于指引 delete 运算符正确析构动态对象
纯虚函数:(一种特殊的虚函数,)
在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做
纯虚函数用法:
纯虚函数是一个在基类中说明的虚函数,在基类中没有定义, 要求任何派生类都定义自己的版本
纯虚函数为各派生类提供一个公共界面
纯虚函数说明形式:
virtual 类型 函数名(参数表)= 0 ;
一个具有纯虚函数的基类称为抽象类。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值