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)
设计模式
简单工厂模式
// 产品原型,产品,工厂,流水线观察者模式
对个观察者同时监听某一主题对象,这个主题对象在状态发生改变时候,会通知所有观察者对象,使他们能够更新自己委托代理模式
- MVC模式
- 实战:简易计算器的实现
里氏代换原则,子类对象一定能代替父类对象的所有行为
依赖倒转原则,面向接口而不是面向实现
迪米特法则,不要调用已封装过的类的东西
单一职责原则,一个类该干神马就做神马,专心干一件事
封闭拓展原则,能加就不要改,保留原始增量
- OO与设计模式第二次复习
- OO与设计模式的原则、目标
- OO与设计模式的原则、目标
- 工厂模式与OO设计原则
- OO与设计模式的原则、目标
- OO与设计模式的原则、目标
- OO与设计模式的原则、目标
- OO与设计模式的原则、目标
- OO与设计模式的原则、目标
- OO与设计模式的原则、目标
- 工厂模式与OO设计原则
- OO与设计模式的原则、目标
- OO与设计模式的原则、目标
- oo分析与设计
- OO设计模式学习笔记
- OO 演化到设计模式
- 设计模式之OO原则
- 设计模式之OO思想
- JDBC使用反射读取properties文件方法笔记
- 正则表达式及API
- Discuz!X数据库函数操作命令(转载)
- shell 嵌套 变量 【 型如 $(( $num1 + $num2)) 】 -1
- 设计模式(四):单例模式Singleton(创建型模式)
- OO与设计模式第二次复习
- 对Rxjava1.0的map方法的源码分析
- blob类型的数据,可以保存图片,直接把图片转化为代码,和text不同,editkindor常用到
- DZY Loves Balls
- static类成员
- 使用 adb 命令一次性为多个设备安装 apk
- Caffe: MNIST 数据集格式转换、用 python 读写 LMDB 数据库
- java学习笔记七:this学习
- git_log