2010年5月31日
摘要: GDI+ 是GDI(Windows 早期版本提供的图形设备接口)的后续版本,是Microsoft Windows XP作系统即后续版本的图形显示技术。它已经集成到了.Net开发环境中,所以不管你的OS是什么版本,只要安装了.Net框架,就有了GDI+(注意:是.Net框架,而不是.Net开发环境,所以Win98中也可以使用GDI+)。 现在,言归正传。 在头文件中加入下面的代码:#include ... 阅读全文
posted @ 2010-05-31 23:50 carekee 阅读(668) 评论(0) 推荐(0)
摘要: 在数学中用gcd(a, b)来表示两个正整数a和b的最大公约数。而且存在下面这个最大公约数递归定理: gcd(a, b) = gcd(b, a mod b) (mod表示取余数) 欧几里得在《几何原本》中描述了利用上面的定理递归求两个正整数的最大公约数的算法。实现起来非常简单,下面是C++代码:unsigned int Euclid(unsigned int nA, unsigned int n... 阅读全文
posted @ 2010-05-31 23:46 carekee 阅读(490) 评论(0) 推荐(0)
摘要: Fibonacci(斐波那契)序列的递归算法大家都已经很熟悉了:// Fibonacci序列第n项的值// 递归算法unsigned int Fib1(unsigned int n){ if (n == 1 || n == 2) return 1; else return Fib(n - 1) + Fib(n - 2);} 而且递归算法的缺点是效率太低,下面是非递归算法:// Fibonacci序... 阅读全文
posted @ 2010-05-31 23:45 carekee 阅读(753) 评论(0) 推荐(0)
摘要: 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数。下面就是一个例子:class CBaseA{public: virtual void TestA();};class CBaseB{public: virtual void TestB();};class CDerived : public CBaseA, public CBaseB{public: virtual void TestA... 阅读全文
posted @ 2010-05-31 23:43 carekee 阅读(748) 评论(0) 推荐(1)
摘要: 一个map就是一个(关键码(key),值(value))对偶的序列,它提供基于关键码的快速提取操作。也就是说,可以用下标运算符[]将关键码作为下标去执行查找,并返回对应的值。因此可以把map的使用方法想象成有特殊下标的数组。在很多时候用下标运算符[]来对map中的元素进行存取是非常方便和简单的;但是,如果map下标运算符[]运用不得当,也会造成意想不到的问题。 我们知道,C++是不检查下标越界的。... 阅读全文
posted @ 2010-05-31 23:42 carekee 阅读(990) 评论(1) 推荐(0)
摘要: 有下面的一个简单的类:class CNullPointCall{public: static void Test1(); void Test2(); void Test3(int iTest); void Test4();private: static int m_iStatic; int m_iTest;};int CNullPointCall::m_iStatic = 0;void CNull... 阅读全文
posted @ 2010-05-31 23:41 carekee 阅读(213) 评论(0) 推荐(0)
摘要: 在我那篇《浅析C++中的this指针》中,我通过分析C++代码编译后生成的汇编代码来分析this指针的实现方法。这次我依然用分析C++代码编译后生成的汇编代码来说明C++中虚函数调用的实现方法,顺便也说明一下C++中的对象内部布局。下面所有的汇编代码都是用VC2005编译出来的。虽然,不同的编译器可能会编译出不同的结果,对象的内部布局也不尽相同;但是,只要是符合C++标准的编译器,编译结果和对象的... 阅读全文
posted @ 2010-05-31 23:41 carekee 阅读(257) 评论(0) 推荐(1)
摘要: 现在,有下面的代码:namespace lx1{ class Point3d { public: Point3d (double dx, double dy, double dz) : m_dX(dx), m_dY(dy), m_dZ(dz) {} double getX() const { return m_dX; }; double getY() const { return m_dY; };... 阅读全文
posted @ 2010-05-31 23:40 carekee 阅读(444) 评论(0) 推荐(0)
摘要: 写这篇文章的动机来源于网友purewinter在我的那篇《重读《设计模式》之学习笔记(三)--SINGLETON模式的疑惑》中的评论。 在那篇文章中,我提供了如下一个用C++实现的Singletion模式的小例子:class ClxSingletonMEC{public: friend ClxSingletonMEC& InstanceMEC();private: ClxSingleton... 阅读全文
posted @ 2010-05-31 23:39 carekee 阅读(405) 评论(0) 推荐(0)
摘要: 在开发中,经常会用到一些数组,它里面存放一定数量(已知,不是太多)的特定元素。在使用数字表示的数组下标访问数组中元素的时候,根本不知道该元素是否是需要的那个元素,而且使代码可读性降低,甚至还会出现下标越界的危险。 比如,现在有如下的继承体系:class CShape;class CSquare : public CShape;class CRectangle : public CShape;cla... 阅读全文
posted @ 2010-05-31 23:38 carekee 阅读(1345) 评论(0) 推荐(0)
摘要: 比如说有这样一个类的继承体系:类CDerivedA和CDerivedB都继承自类CBase。如果要写一个函数传入上面类中的一个对象的引用,在函数里面我们要根据对象的类型来进行相应的处理,也就是说对不同类型的对象进行不同的处理。在这种情况下我们就需要类的对象中保存有类型信息。下面就用一个简单的例子来说明怎么让自己编写的类有类型信息。 首先,根据类的继承关系创建类型信息tag:struct lx_Ba... 阅读全文
posted @ 2010-05-31 23:37 carekee 阅读(281) 评论(0) 推荐(0)
摘要: 引子 如果让你用C++写一个实用的字符串类,我想下面的方案是很多人最先想到的:class ClxString{public: ClxString(); ClxString(const char *pszStr); ClxString(const ClxString &str); ClxString& operator=(const ClxString &str); ~Clx... 阅读全文
posted @ 2010-05-31 23:36 carekee 阅读(419) 评论(0) 推荐(0)
摘要: 比如我们有下面的类:class ClxECS{public: int DoSomething() { // 这里以输出一句话来代替具体的操作 cout << "Output from method DoSomething!" << endl; return 0; };}; 和下面的一个vector:vector<ClxECS*> vECS;for (int i ... 阅读全文
posted @ 2010-05-31 23:35 carekee 阅读(400) 评论(0) 推荐(0)
摘要: 对于如下的类:class ClxECS{public: double Test(double dValue) { return dValue * 13; };private: int Test(int iValue) { return iValue * 13; };}; 下面的函数输出是什么?void ECS_test(){ int iValue = 13; ClxECS lx; cout <... 阅读全文
posted @ 2010-05-31 23:34 carekee 阅读(288) 评论(0) 推荐(0)
摘要: mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数... 阅读全文
posted @ 2010-05-31 23:34 carekee 阅读(170) 评论(0) 推荐(0)
摘要: 我们知道,类的私有成员在类的外部是不能被访问的。 例如有下面的这个简单的类:class ClxECS{private: int iPrivate;}; 那么下面的这个函数是不能通过编译的:void ECS_test(){ ClxECS lx; lx.iPrivate = 13; cout << lx.iPrivate << endl;} 但是,我们并不是没有办法来访问类的... 阅读全文
posted @ 2010-05-31 23:33 carekee 阅读(929) 评论(0) 推荐(0)
摘要: 怎么对容器中的所有对象都进行同一个操作?我们可能首先想到的是用循环来实现。 比如有如下的一个类:class ClxECS{public: int DoSomething() { // 这里以输出一句话来代替具体的操作 cout << "Output from method DoSomething!" << endl; return 0; };}; 现在定义如下一个vect... 阅读全文
posted @ 2010-05-31 23:32 carekee 阅读(249) 评论(0) 推荐(0)
摘要: 有如下一个简单的复数类:class ClxComplex{public: ClxComplex(double dReal = 0.0, double dImage = 0.0) { m_dReal = dReal; dImage = dImage; } double GetReal() const { return m_dReal; } double GetImage() const { retu... 阅读全文
posted @ 2010-05-31 23:30 carekee 阅读(288) 评论(0) 推荐(0)
摘要: 我在今年2月份写了篇《C++中接口与实现分离的技术》的文章,用一个很简单的例子说明了在C++中接口与实现分离的好处及实现方法。很荣幸,这篇文章被推荐到了CSDN的首页并被多家网站转载。 可是当时写那篇文章的时候,没有考虑到类与类之间的继承关系。下面我就来具体的谈谈这个方面。 还是以上面提到的那篇文章中的例子来说明。 执行类: lxImplement.h文件内容:#include "lxTest.h... 阅读全文
posted @ 2010-05-31 23:29 carekee 阅读(303) 评论(0) 推荐(0)
摘要: 在开发的时候会遇到这种情况,就是在执行某些功能的时候要对一些环境变量或配置信息进行修改,功能执行完毕之后再把这些变量或配置信息设置恢复回去。举个例子:有些游戏只能在分辨率为800*600的环境下运行,如果要在分辨率1024*768的电脑上玩,就要在运行游戏的时候把分辨率改为800*600,退出游戏的时候再把分辨率改回1024*768。 其实处理这样的情况也不是很难,我们可以写一个设置环境变量或配置... 阅读全文
posted @ 2010-05-31 23:29 carekee 阅读(380) 评论(0) 推荐(0)