OO与设计模式第二次复习

来源:互联网 发布:北京尚学堂java学费 编辑:程序博客网 时间:2024/06/07 02:13

对象的内存布局
系统为每个对象分配一块栈空间存储数据成员

每个成员函数都包含一个隐藏参数(编译器自动加上的):this指针
(其实可以理解为OC的self)

封装

:黑盒
// 封装到类中的函数,需要添加static修饰符

继承

:泛性关系

多态

1 静态多态性:函数重载,运算符重载
2 动态多态性:虚函数
C++中的虚函数的实现一般是通过虚函数表(效率不高,额外占空间)。
编译器会为每个有虚函数的类创建一个虚函数表,该虚函数表将被该类的所有对象共享。类的每个虚成员占据虚函数表中的一行。如果类中有N个虚函数,那么其虚函数表将有N*4字节的大小。
作用:应对变化
virtual 原则:如果某一方法有可能会被子类重写,那么这个方法必须要声明为虚函数
注意:

  • 只能将类的成员函数申明为虚函数
  • 如果在派生类中没有对基类虚函数的重新定义,那么派生类简单继承其直接基类的虚函数

出现子类的场合都可以用基类替换他

虚函数实现机制
只有有一个虚函数,就生成虚表
虚表:函数指针(指向成员函数)数组(数据结构)
有一个指针vfptr指向这个虚表,每多一个对象,就有多一个指针vfptr指向同个虚表
产生派生类后,重写后(有没有virtual都一样),把函数指针指向的函数替换成新函数

重载,覆盖,重写

重载:一个函数名多种不同实现(必须在同一个类里)
覆盖:

class Csharpe {    public:    double GetArea {...};};class Circle : public CSharpe {    public:    double GetArea {...};};

没有报错是因为作用域不同

重写:写一个函数,和其中某个函数的函数名,函数返回值,参数都一样(有没有const那就不是重写了,是新加)

class A {public:    void func1() {        std::cout << "Afuc1" << std:: endl;    }};class B : public A {public:    void func1() {        std::cout << "B" << std::endl;    }};

B类重写了A的方法,违反了里氏代换原则

构造函数能不能私有?

可以
设计模式中的单例模式

C c1;ci.m = 10;C c2;C c3;...

对于一个类,只有一个对象,c2 == c3 == c1
不管创建多少次,在内存中都只有一份(只允许存在一个副本)

析构函数一定需要定义成虚函数么?

在需要继承的时候,为了防止内存泄漏,最好定义成虚函数

抽象类

方法的集合
一个类,继承的除了一个属性类,其他都是继承自需要遵守的协议(协议!!!!)
纯虚函数,是必须实现的方法(requish),普通的虚函数 ,可选择(optional)

设计模式

  1. 简单工厂模式
    // 产品原型,产品,工厂,流水线

  2. 观察者模式
    对个观察者同时监听某一主题对象,这个主题对象在状态发生改变时候,会通知所有观察者对象,使他们能够更新自己

  3. 委托代理模式

  4. MVC模式
  5. 实战:简易计算器的实现

里氏代换原则,子类对象一定能代替父类对象的所有行为
依赖倒转原则,面向接口而不是面向实现
迪米特法则,不要调用已封装过的类的东西
单一职责原则,一个类该干神马就做神马,专心干一件事
封闭拓展原则,能加就不要改,保留原始增量

0 0
原创粉丝点击