一、关于类
对象是类的实例(instance),类是一个概念,实例是具体的、具有内存的。
两个关系:has a、is a
has a
包含关系,例如公司有一个程序员。
聚合:主体消亡时,各组件可继续存在。公司破产,程序员给别的老板打工。
组合:主体消亡时,组成组体的各部分也消亡。程序员离开公司时,桌上的书、地上的拖鞋,一起也要离开公司。
is a
继承关系 inheriting,又叫派生(deriving)、扩展(extending)。通用功能放入基类(base),子类(subclass)可以扩展基类,子类也可改写基类行为
好的层次结构
- 类之间存在有意义的功能联系
- 共同的功能放入基类,从而支持代码重用
- 避免子类过多地重写父类的功能,除非父类是一个抽象类 —— C++20高级编程
多重继承
一个类可以有多个基类。多重继承会破坏清晰的层次结构,且实现复杂。不推荐使用。
抽象基类
多态 polymorphism
遵循一套标准属性和方法的对象可以互换使用。能最大利用继承的优势。比如,公司只告诉员工9点上班,而不用关心某个员工具体是怎么上班(打车、开车、地铁....)
二、类的结构、组成
构造函数
析构函数
1、类的定义
// 简单版本:类比 int cat;
class Cat{};
// 中等版本
class Cat {
public: // UML中 + 表示
公有成员
private: // UML中 - 表示
私有成员
protected:// UML中 # 表示
保护成员 —— 于继承相关
};
以分号结尾
2、类的成员:
- 成员函数—— 相对应的普通函数
- 成员变量
- 成员枚举
- 类型别名
- 嵌套类
建议—— 初始化类内的数据成员(类成员初始化器)
声明与定义的区别?
- 声明指明方法原型
- 定义指明方法实现
成员函数定义放类内还是类外?
class 定义放.h 还是放.cpp?
this 指针
3、static、const、virtual、override
4、访问控制
出于隐藏信息的目的,数据成员放private;接口函数(围绕数据成员设置)放public;
同一类域内,类域贯穿,可以忽略掉public、protected、private,他们是给外面看的。类内的成员、函数,相互之间都可以访问。如:成员函数Cat::funcA调用另一个成员函数Cat::funcB给成员变量Cat::catNum赋值(Cat:: 表示他们都是类Cat内的成员)
5、与struct 相比,class 默认都是private,struct 默认是public;
其他方面cpp内部,二者使用方式几乎无差异
struct Cat {
int catNum; // public
};
class Cat {
int catNum; // private
};
private、public、protected 可以出现多次,顺序也没要求。但尽量规整放在一起
4、。
Lsp Liskov Substitution Principle 里氏替换原则:在不改变行为的情况下,用派生类替代基类。
参考:
1、C++20高级编程