随笔分类 - OOP
摘要:From:The Principles of OODWhat is object oriented design? What is it all about? What are it's benefits? What are it's costs? It may seem silly to ask these questions in a day and age when virtually ev...
阅读全文
摘要:转载整理自:关于虚函数那点破事问题:如果你是C++程序员,我想你可能遇到过这样的情况: 在debug时,对着一个函数step into,明明调用的是A函数,可是结果却跳进了B函数。 为什么,call stack里显示的也是明明白白,就是直接进了B函数。百思不得其解,于是你怀疑是不是系统出了问题,是不是编译器出了问题,是不是调试器出了问题~~~ 其实那些玩意不是那么容易出错的,先看看你你的A,B函数...
阅读全文
摘要:1. 更多的UML drawing tools. Prefer UMLet for now. Martin Fowlerlikes UMLGraph (I don't have feeling about it now). And Two very suggested UML tools by a guy who have practiced with many UML tools (let's ...
阅读全文
摘要:One thing for sure is that in child class, only parent class's public and protected methods can be accessed.1. When to call CBase::func() ? In case you want to call a virtual function that is overridd...
阅读全文
摘要:C++ Class Templates are used where we have multiple copies of code for different data types with the same logic. If a set of functions or classes have the same functionality for different data types, ...
阅读全文
摘要:static_cast:强制类型转换cast。因此,当然可以用于有继承关系的类之间的cast,细分有三类: upcast:Just same as dynamic_cast. 由于不用做runtime类型检查,效率比dynamic_cast高; downcast:不安全得很。不建议使用。 crosscast:不能用。带来编译错误。 dynamic_cast:有继承关系的类之间的cast。非常安全...
阅读全文
摘要:强制类型转换,其最根本的是什么了?我们可以这样理解: 某块内存中的数据是不变的,而类型就是我们戴上的眼镜,当我们戴上一种眼镜后,我们就会用对应的类型来解释内存中的数据,这样不同的解释就得到了不同的信息。 所谓强制类型转换实际上就是换上另一副眼镜后再来看同样的那块内存数据。 例如:
阅读全文
摘要:malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于ma...
阅读全文
摘要:通常有compiler将其分解成为多步构造。 Constructor 被分解后应该是这样的: 1)对于一个most derived类,初始化vbptr,并调用virtual base 的构造函数。 2)调用non-virtual base classes 的构造函数。 3)调用data members的构造函数 4)初始化vfptr。 5)执行用户写在constructor中的代码。 Des...
阅读全文
摘要:在构造和析构期间不要调用虚函数,因为这样的调用不会匹配到当前执行的构造函数或析构函数所属的类的更深的派生层次。 假设你有一套模拟股票处理的类层次结构,例如,购入流程,出售流程等。对这样的处理来说可以核查是非常重要的,所以随时会创建一个 Transaction 对象,将这个创建记录在核查日志中是一个适当的要求。下面是一个看起来似乎合理的解决问题的方法: ...
阅读全文
摘要:通过使用RTTI,程序可以在运行时通过基类的指针或者引用来得到所指对象的实际类型。主要有两个操作:(1)typeid操作符:返回指针或者引用所指对象的实际类型。(2)dynamic_cast操作符:将基类类型的指针或引用安全地转换为派生类型的指针或者引用。注意:只有当类中至少有一个虚函数时,才能返回我们所需的动态类型信息;否则,只能返回静态类型信息。 dynamic_cast操作符 ...
阅读全文
摘要:【转载自:http://blog.csdn.net/Elminster/archive/2004/02/18/9741.aspx】 先来看一小段代码,它取自 Bjarne Stroustrup 的演讲“Speaking C++ as a Native”: // use an object to represent a resource ("resource acquisition is init...
阅读全文
摘要:考虑以下函数: void f() { Investment *pInv = createInvestment(); // call factory function ... // use pInv delete pInv; // release o...
阅读全文
摘要:类都应该是各司其职的,负责的功能块应该尽可能单一、内聚。一般在考虑类设计时,从项目实现角度设计一个类比较容易想。一个功能一个类,等等。。 但是,千万不要忘记,总有一些类,是做任何项目都需要的,比如:管理全局数据的类,管理string处理的类,等等。我们也应该设计这样一些管理其他类用到的资源的manager来帮助其他功能类更加心无旁骛的做好自己的事情。比如,全局数据,static数据,很多类都要用,...
阅读全文
摘要:构造一个类:就是构造它的各个成员及基类,然后调用构造函数初始化的过程,是一个从局部到整体逐步构建的过程。 析构一个类:就是调用析构函数释放相关资源,然后,分别析构各个成员及基类的过程,是一个逐步分解回收内存空间的过程。 注:对一个类的成员及基类的构造或析构,就是递归构造或析构一个类。递归构造、析构的过程的终止条件,可以认为是当构造或析构到一个简单对象,如int,double数据成员。
阅读全文
摘要:Most of the times, we’re learning just a little too much. We’re attracted to interesting stuff like a moth to a flame. Or oftentimes we just learn what everybody else around us is learning or what we’...
阅读全文
摘要:摘自:学习C++:实践者的方法 事实10:一旦我们熟悉了一门语言之后,就容易不知不觉地在其框架下思考,受到语言特性的细节的影响,作出second-class的设计。 对于像C++这样的在抽象机制上作了折衷的语言,尤其如此,思考容易受到语言机制本身细节的影响,往往在心里头还没想好怎么抽象,就已经确定了使用什么语言机制乃至技巧;更有甚者是为了使用某个特性而去使用某个特性。然而,实际上,我们应该—...
阅读全文
摘要:转载地址:http://blog.csdn.net/xushiweizh/archive/2006/11/06/1370337.aspx 下面这个问题摘自论坛的一个帖子: 已知3个类O、P和Q,类O中定义了一个私有方法F1、一个公有方法F2和一个受保护的方法F3:类P和类Q是类O的派生类,其继承方式如下所示: class P : protected O {…}; class Q : publ...
阅读全文
摘要:在我那篇《浅析C++中的this指针》中,我通过分析C++代码编译后生成的汇编代码来分析this指针的实现方法。这次我依然用分析C++代码编译后生成的汇编代码来说明C++中虚函数调用的实现方法,顺便也说明一下C++中的对象内部布局。下面所有的汇编代码都是用VC2005编译出来的。虽然,不同的编译器可能会编译出不同的结果,对象的内部布局也不尽相同;但是,只要是符合C++标准的编译器,编译结果和对象的...
阅读全文
摘要:理解虚函数( virtual function )的几个关键点: 1. 理解早绑定(early binding)、晚绑定(late binding)。所谓early binding:On compile time,就能明确一个函数调用是对哪个对象的哪个成员函数进行的,即编译时就晓得了确定的函数地址;所谓late binding:On compile time,对函数(虚函数)的调用被搞...
阅读全文

浙公网安备 33010602011771号