
C++
文章平均质量分 76
StarLee
欢迎大家访问我的Blog。
主要是C++,设计模式,面向对象设计和.Net方面的技术文章。
展开
-
《Effective C++ 中文版 2nd Edition》读后感
大学的时候学校开了C++的课程,我考的还不错。毕业后就一直搞软件开发,大概一年前开始用VC做项目。最近静下心来看了C++的经典著作《Effective C++ 》,才发现自己的C++水平其实真的很一般!书中提到的有些东西,我竟然从来没有注意过!还有些竟然是我第一次听说!下面以实例说明(我用我写的更小的例子代替了书中的例子,书中原文我用红色标示)。1.关于类成员的初始化顺序问题 条原创 2005-12-28 12:53:00 · 5308 阅读 · 7 评论 -
STL中bind2nd的用法
比如我们有下面的类:class ClxECS{public: int DoSomething() { // 这里以输出一句话来代替具体的操作 cout "Output from method DoSomething!" endl; return 0; };}; 和下面的一个vector:v原创 2007-01-18 09:21:00 · 17216 阅读 · 3 评论 -
让你编写的类也有类型信息
比如说有这样一个类的继承体系:类CDerivedA和CDerivedB都继承自类CBase。如果要写一个函数传入上面类中的一个对象的引用,在函数里面我们要根据对象的类型来进行相应的处理,也就是说对不同类型的对象进行不同的处理。在这种情况下我们就需要类的对象中保存有类型信息。下面就用一个简单的例子来说明怎么让自己编写的类有类型信息。 首先,根据类的继承关系创建类型信息tag:s原创 2007-06-27 08:50:00 · 6736 阅读 · 17 评论 -
大师也犯低级错误--《CODE COMPLETE (Second Edition)》中的2处代码错误
最近比较闲,就看了那本放在书架上很久的“砖头”著作--经典的《CODE COMPLETE (Second Edition)》。当然是中文版的,这种大块头的书看英文版是非常累的。 看到第18章表驱动法Table-Driven-Methods时,感觉这种方法非常好,而我以前也从来没用过这种方法。于是就多看了两眼,没想到就是这多看的两眼,竟然让我在在C++示例代码中发现了大师级作者Stev原创 2007-08-09 09:17:00 · 7056 阅读 · 8 评论 -
引用计数(Reference Counting)和代理(Proxy)的应用
引子 如果让你用C++写一个实用的字符串类,我想下面的方案是很多人最先想到的:class ClxString{public: ClxString(); ClxString(const char *pszStr); ClxString(const ClxString &str); ClxString& operator=(const ClxString &str原创 2007-06-11 09:03:00 · 6942 阅读 · 3 评论 -
用枚举定义有意义的数组下标
在开发中,经常会用到一些数组,它里面存放一定数量(已知,不是太多)的特定元素。在使用数字表示的数组下标访问数组中元素的时候,根本不知道该元素是否是需要的那个元素,而且使代码可读性降低,甚至还会出现下标越界的危险。 比如,现在有如下的继承体系:class CShape;class CSquare : public CShape;class CRectangle : public原创 2007-09-06 08:52:00 · 12816 阅读 · 14 评论 -
C++中friend对类封装性的强大破坏性
写这篇文章的动机来源于网友purewinter在我的那篇《重读《设计模式》之学习笔记(三)--SINGLETON模式的疑惑》中的评论。 在那篇文章中,我提供了如下一个用C++实现的Singletion模式的小例子:class ClxSingletonMEC{public: friend ClxSingletonMEC& InstanceMEC();private:原创 2007-10-30 09:12:00 · 13404 阅读 · 47 评论 -
浅析C++中的this指针
有下面的一个简单的类:class CNullPointCall{public: static void Test1(); void Test2(); void Test3(int iTest); void Test4();private: static int m_iStatic; int m_iTest;};int CNullPointCal原创 2008-01-24 10:00:00 · 60350 阅读 · 57 评论 -
浅析C++中虚函数的调用及对象的内部布局
在我那篇《浅析C++中的this指针》中,我通过分析C++代码编译后生成的汇编代码来分析this指针的实现方法。这次我依然用分析C++代码编译后生成的汇编代码来说明C++中虚函数调用的实现方法,顺便也说明一下C++中的对象内部布局。下面所有的汇编代码都是用VC2005编译出来的。虽然,不同的编译器可能会编译出不同的结果,对象的内部布局也不尽相同;但是,只要是符合C++标准的编译器,编译结原创 2008-02-13 09:26:00 · 15814 阅读 · 21 评论 -
C++中一个容易被忽视的名字查找规则
现在,有下面的代码:namespace lx1{ class Point3d { public: Point3d (double dx, double dy, double dz) : m_dX(dx), m_dY(dy), m_dZ(dz) {} double getX() const { retu原创 2007-12-10 09:12:00 · 7385 阅读 · 29 评论 -
小心使用STL中map的[]操作符
一个map就是一个(关键码(key),值(value))对偶的序列,它提供基于关键码的快速提取操作。也就是说,可以用下标运算符[]将关键码作为下标去执行查找,并返回对应的值。因此可以把map的使用方法想象成有特殊下标的数组。在很多时候用下标运算符[]来对map中的元素进行存取是非常方便和简单的;但是,如果map下标运算符[]运用不得当,也会造成意想不到的问题。 我们知道,C++是不检原创 2008-04-07 09:26:00 · 22941 阅读 · 12 评论 -
C++中的mutable关键字
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面原创 2006-12-05 09:13:00 · 38996 阅读 · 9 评论 -
C++中巧用#define访问类的私有成员
我们知道,类的私有成员在类的外部是不能被访问的。 例如有下面的这个简单的类:class ClxECS{private: int iPrivate;}; 那么下面的这个函数是不能通过编译的:void ECS_test(){ ClxECS lx; lx.iPrivate = 13; cout lx.iPrivate endl;}原创 2006-11-22 09:11:00 · 5804 阅读 · 20 评论 -
STL中mem_fun和mem_fun_ref的用法
怎么对容器中的所有对象都进行同一个操作?我们可能首先想到的是用循环来实现。 比如有如下的一个类:class ClxECS{public: int DoSomething() { // 这里以输出一句话来代替具体的操作 cout "Output from method DoSomething!" endl; ret原创 2006-11-21 09:11:00 · 22832 阅读 · 18 评论 -
我出的C++试题
一、问答题1.请说明类的纯虚函数、虚函数、静态成员函数、普通成员函数的区别。2.什么情况下,类的析构函数应该声明为虚函数?为什么?3.对于下面的代码:class myString;myString *pStringArray = new myString[13];以下两种delete有什么区别?delete pStringArray;delete []pStri原创 2006-01-12 11:02:00 · 4867 阅读 · 11 评论 -
C++中虚析构函数的作用
我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明: 有下面的两个类:class ClxBase{public: ClxBase() {}; virtual ~ClxBase() {}; virtual void DoSomething() { cout "Do something原创 2006-03-09 15:34:00 · 193958 阅读 · 88 评论 -
《The C++ Programming Language (Special Edition)》中的忠告
第1章 致读者[1] 在编写程序时,你是在为你针对某个问题的解决方案中的思想建立起一种具体表示。让程序的结构尽可能地直接反映这些思想: [a] 如果你能把“它”看成一个独立的概念,就把它做成一个类。 [b] 如果你能把“它”看成一个独立地实体,就把它做成某个类的一个对象。 [c] 如果两个类有共同的界面,将此界面做成一个抽象类。 [d] 如果两个类的实现有某些显著的共同原创 2006-01-19 09:14:00 · 4533 阅读 · 0 评论 -
C++中禁止类被派生的方法
在我的那篇“C++中虚析构函数的作用”中我说明了为什么作为基类的类的析构函数必须是虚函数,同时也指出:为了避免产生虚函数表,如果类不是基类的话,析构函数就不需要声明为虚函数。 但是,我们不能预料用户的行为,你不敢肯定用户是否会从你的类去派生自己的类。如果用户以一个基类指针去删除一个派生类的对象,就会发生派生类的析构函数不被调用的情况。这样做的危险性我想大家都知道。当然,你可以在类的说原创 2006-03-14 10:23:00 · 6748 阅读 · 0 评论 -
C++中接口与实现分离的技术
在用C++写要导出类的库时,我们经常只想暴露接口,而隐藏类的实现细节。也就是说我们提供的头文件里只提供要暴露的公共成员函数的声明,类的其他所有信息都不会在这个头文件里面显示出来。这个时候就要用到接口与实现分离的技术。 下面用一个最简单的例子来说明。 类ClxExp是我们要导出的类,其中有一个私有成员变量是ClxTest类的对象,各个文件内容如下: lxTest.h文件内容原创 2006-02-27 09:08:00 · 48845 阅读 · 67 评论 -
巧用构造函数与析构函数对数据进行设置和恢复
在开发的时候会遇到这种情况,就是在执行某些功能的时候要对一些环境变量或配置信息进行修改,功能执行完毕之后再把这些变量或配置信息设置恢复回去。举个例子:有些游戏只能在分辨率为800*600的环境下运行,如果要在分辨率1024*768的电脑上玩,就要在运行游戏的时候把分辨率改为800*600,退出游戏的时候再把分辨率改回1024*768。 其实处理这样的情况也不是很难,我们可以写一个设置原创 2006-10-10 09:17:00 · 4907 阅读 · 1 评论 -
C++中的显式构造函数
有如下一个简单的复数类:class ClxComplex{public: ClxComplex(double dReal = 0.0, double dImage = 0.0) { m_dReal = dReal; dImage = dImage; } double GetReal() const { return m_dReal; } double GetIma原创 2006-10-12 09:26:00 · 12155 阅读 · 11 评论 -
小心C++编译器的陷阱
有下面一个简单的类:class ClxTest{public: ClxTest(int iSize = 13) { pszStr = new char[iSize]; }; ~ClxTest() { if(pszStr) delete []pszStr; }; lxOutput() { cout pszStr endl; };private: char原创 2006-06-09 09:50:00 · 4053 阅读 · 12 评论 -
再论C++中接口与实现分离的技术
我在今年2月份写了篇《C++中接口与实现分离的技术》的文章,用一个很简单的例子说明了在C++中接口与实现分离的好处及实现方法。很荣幸,这篇文章被推荐到了CSDN的首页并被多家网站转载。 可是当时写那篇文章的时候,没有考虑到类与类之间的继承关系。下面我就来具体的谈谈这个方面。 还是以上面提到的那篇文章中的例子来说明。 执行类: lxImplement.h文件内容:原创 2006-07-04 08:49:00 · 5234 阅读 · 2 评论 -
C++中重载决议与可访问性检查的顺序
对于如下的类:class ClxECS{public: double Test(double dValue) { return dValue * 13; };private: int Test(int iValue) { return iValue * 13; };}; 下面的函数输出是什么?void ECS_test(){ int iVal原创 2006-11-23 09:13:00 · 4425 阅读 · 3 评论 -
C++多继承中重写不同基类中相同原型的虚函数
在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数。下面就是一个例子:classCBaseA{public:virtualvoidTestA();};classCBaseB{public:virtualvoidTestB();};classCDerived:publicCBaseA,原创 2008-08-25 09:46:00 · 15673 阅读 · 58 评论