CS100上学习的面向对象内容更为详细,也更为复杂。尽管这门课的进度相比SI100B已经放缓了不少,但由于我没有学习的基础,因此打算写一份笔记。
面向对象的编程主要具有三个特点:Encapsulation(封装)、Inheritance(继承)和Polymorphism(多态)。在SI100B中我们大概只学习了encapsulation,而剩下的内容会较为详细地记录。
杂项
Code Organization
Complication
Encapsulation/封装
封装的目的是为了隐藏信息及抽象化,达成分离interface(接口)和implementation(实现),从而能在使用interface的同时不需要知道任何有关implementation的内容。
Classes: Morphing from Struct/类
相比C中的structs(在C++中,class和struct实际上差别不大),classes有member functions(成员函数),这些fxns会在类的declaration(声明)中。
在类外实现时,成员函数的声明遵循如下格式:
ClassName::FunctionName
它们能够直接访问类中的所有member variables(成员变量)。
使用类时,相当于创造了一个类的instance(实例),它是类的type的一个对象。
Access/访问
Access Specifier/访问说明符
类中对象的默认specifier是private。
Member Functions/成员函数
Overload/重载
Constructor/构造函数
Inheritance/继承
Object Relationship/对象关系
C++中对象的关系有两种:inheritance和association,其中association又分为composition和aggregation。
Inheritance/继承
一个类继承的类是它的父类/基类(parent class/base class/superclass),它是那个类的子类/派生类(child class/derived class/subclass)。inheritance的格式是
class childClassName: public parentClassName
实际上inheritance可以通过private和protected完成。
可以进行多重inheritance,即一个child class有多个parent class。
child class可以use(使用parent的behaviours),extend(创建新的behaviours)和replace(override parent的behaviours)。
继承的对象是parent class的public fxns&vars,protected fxns&vars和private vars,但private vars不可以直接被child class访问。如果child希望访问private vars,可以通过访问protected fxns的方式与这些变量进行交互。
Overriding
overloading和overriding的区别是,overloading是使用相同的函数名,但对于每个overloaded implementation有不同的参数;而overriding是使用相同的函数名和参数,但有不同的implementation。
overriding只可能通过inheritance实现。
值得注意的是,overriding的fxn可以直接通过scope resolution operator(域解析运算符,即::)调用parent的原fxn。
Overloading
overriding的优先级(precedence)比overloading高,所以编译器会优先尝试overriding。这意味着如果直接写了不同的参数,可能不会达到期望的效果。
为了overload,我们需要
returnType childClassName::functionName(variableType variableName);
returnType childClassName::functionName(variableType1 variableName1,variableType2 variableName2);
这样,上面完成了overriding,下面完成了overloading。
Composition/
composition是指parent class包含了child class,并且如果parent class is destroyed,那么child class is also destroyed。composition的格式是
class parentClassName
{
childClassName m_childClassName;
}
Aggregation/
aggregation是指parent class链接向child class,因此即使parent class is destroyed,child class也不会be destroyed。我们需要用pointer实现这一效果。aggregation的格式是
class parentClassName
{
childClassName *m_childClassName;
}