静态函数没有this指针,静态函数只能存取静态变量。
调用静态函数的方法有两种:
1是通过对象调用
2如果还没有创建对象,可以通过类名来调用 (类名::静态函数)
singleton(只能存在一个对象a ,不能再创造对象):如下图用静态来实现
cout为什么所有类型都可以输出?cout的本质:
关键字namespace:如下图
namespace + 名字 (std是标准库)
左一为全部打开,左二为只打开了cout,即用到cout的时候前面才不用声明std::,左三为全部都用全名。
复合与继承:
复合(has a):类里面有一个(或者n个)其他类的对象。 下图中queue的功能都是由deque实现的,此时queue就是Adapter,即由deque改造的
次序:(编译器默认自己执行的)
委托:两个类之间用指针相连,与复合的区别是复合是两个类一起出现的,一个类的功能依赖另一个类实现,有了外部就有内部。而委托则是两个不是同步的,比如下面的string,等到需要用到rep的时候可能才去创建右边的对象。
下面这种写法为pimpl(很有名,因为很灵活,右边怎么设置都不影响左边用户接口):左边public只是提供对外的接口,字符串本身该怎么设计全在右边实现。同时设计也实现了共享,即如果创建了三个字符串(创建一个拷贝两个)会共同指向一个右边创建的rep指针,节省了内存。要改a的内容的时候右边会复制一个指针,bc共享。
继承(is a):一般都是public继承
基类的析构最好是virtual
虚函数:(重新定义即重写,但不是重载) pure vitual是纯虚函数,意思是在子类里一定要去重写它,不然就是0.
如下图:
父类的关键动作延缓到子类去实现,这个关键动作就叫做Template Method,23个设计模式之一。这就引出了应用程序框架的概念(Application framework),在应用程序框架中就可以大量使用Template Method。
子类对象调用的父类函数中的Serialize函数为什么调回的是子类的定义?这是因为函数调用里的this指针传进了父类,而父类中是用this指针指向的Serialize函数,所以就会调用子类的虚函数表中的虚函数。
下图是上图的详细代码
下面的一种设计模式可以使得应用程序拷贝调用未来需要添加的类的对象。只需要未来添加类的时候在内部创建一个静态的自己的类,构造函数设置为私有,这样在创建自己(原型)的时候会调用私有的构造函数,在构造函数里设置addprototype(),把自己this指针传上去,这样框架就可以通过类的原型(下图是image)调用clone()做出一个副本
+public -private #protected
框架:
子类:这里的protected里的LandSatImage(int)设计非常巧妙,因为在克隆原型的时候势必会调用构造函数,而构造函数又会调用addprototype()再传一次this指针,程序肯定是不想这么做的,所以加了有参构造,避免再次构造,这里的LandSatImage(int)可以放在私有区域或者保护区域,只要不是公共区域就行,因为这些东西不打算公开。