CS100:C++面向对象学习笔记

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;
}

Polymorphism/多态

Copy Constructor/复制构造函数

上一篇:关于A method overriding another method must not redefine the parameter constraint configuration解决方法


下一篇:72、java中实现多态的机制是什么?