c++学习总结一

详见:http://blog.csdn.net/jinjie_ing/article/details/42741771
静态常量与非静态常量的区别
在创建对象的时候,需要每个成员变量(非静态)开辟内存空间,类变量(静态变量)则是在类加载的时候就创建好了。
用static修饰过的常量会存到常量池里面。存入的方式是:先到常量池里面寻找,看是否该常量已经存在,如果存在返回该常量的引用,不存在就在常量池里面新建一个常量,返回引用。如果没有修饰,就属于对象的属性,绝大多是对象是存在中,也就是如果多个对象存在同样一个常量,在堆中会为每一个对象的该常量分配存储空间。由此可以看出,static修饰后的作用就是减少内存的消耗,常量的存储位置发生了变化。在下图中静态常量存储在只读的代码和数据区也就是全局静态区。

c++学习总结一

动态绑定:

编译器:静态
运行期:动态
继承关系:在运行状态下是不能改变的,可能会产生组合爆炸的情况。
所以组合由于继承(大结构)。
动态绑定:运行时刻才确定。
纯虚类,抽象类,接口类,抽象出统一的接口。
一旦一个基类的某个成员函数被定义为虚函数,不论在派生类中是否声明virtual,派生类的对应成员数均为虚函数。
虚函数有以下几点限制:

  1. 静态成员不能是虚函数:静态成员是属于类的不是属于某个对象的,不依赖与对象所以不可以通过对象去识别,也就不能够作为虚函数。
  2. 只有类的成员函数才能是静态函数。显然
  3. 构造函数不能是静态函数:为什么?
    为什么呢?
    1.我觉得 首先派生类的对象构造的时候必须先层层调用基类的构造函数 再调用派生类自己的构造函数, 如果构造函数为虚函数 在用基类指针指向派生类的对象的时候, 将会先调用的是派生类的构造函数 而不会再调用基类的构造函数, 这会导致构造出来的缺省基类成员变量 。
    2.在定义类时,只是通知编译器需要准备多大的内存空间,并没有为它分配内存空间只有用类创建了对象后,才会真正占用内存空间。也就是说类的定义时并不会产生任何实际变量以及空间 这只是一段代码。在用到类去实例化对象的时候,编译器才会根据从类定义里知道的需要分配多大的内存空间去给实例化对象分配内存空间。 虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的
    问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化, 也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。
  4. 析构函数往往可以是虚函数:我们往往通过基类的指针来销毁对象。这时候如果析构函数不是虚函数,就不能正确识别对象类型从而不能正确调用析构函数。因为派生类对象消亡的时候,先会调用派生类的析构函数,再会层层往上调用基类的析构函数(先构造的后析构),如果用基类的指针来析构派生类对象,如果析构函数不是虚函数,那么调用的将是基类的析构函数(因为此时的指针或者引用是基类的以此识别),将不会调用派生类的析构函数,那么只会析构派生类对象中属于基类的部分而属于派生类的部分没办法正常析构!反过来将析构函数设置为虚函数将调用的是派生类的析构函数,而派生类的析构函数一旦调用就会层层往上调用基类的析构函数所以此时该对象才能正常析构!(个人理解写的啰嗦哈)
  5. 虚函数是不能内联的:显然内联函数不能为虚函数,原因在于虚表机制需要一个真正的函数地址,而内联函数展开以后,就不是一个函数,而是一段简单的代码(多数C++对象模型使用虚表实现多态,对此标准提供支持),可能有些内联函数会无法内联展开,而编译成为函数。但是有些情况下即使虚函数是内联函数仍然正确的动态绑定!原因是:即使虚函数被声明为内联函数,编译器遇到这种情况根本不会把这样的函数内联展开,而是当做普通函数来处理

对接口编程,不对实现编程:用抽象类纯虚类去抽象公共的基础的接口,不对具体实现去编程。
封装变化:这个地方到底需不需要封装起来,要不要用抽象的形式,具体是需求功能所决定的,我们要做的是在最重要的变化点,需要动态扩展的地方去封装,以应对以后未知的变化。

策略模式:

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
这里是一个例子用于理解:https://www.cnblogs.com/xinxue/p/5271184.html
还有关于 VS2015运行结果窗口一闪即过的问题:http://blog.csdn.net/u014374259/article/details/50652237
https://www.cnblogs.com/zuoxiaolong/p/pattern8.html