cly

博客园 首页 新随笔 联系 订阅 管理

2013年6月28日 #

摘要: 作用:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。Builder模式和AbstractFactory模式在功能上很相似,因为都是用来创建大的复杂的对象,它们的区别是:Builder模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说Builder模式中对象不是直接返回的。而在AbstractFactory模式中对象是直接返回的,AbstractFactory模式强调的是为创建多个相互依赖的对象提供一个同一的接口。适用于以下情况:1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。2)当构造过程必须允许被构造的对象有不 阅读全文
posted @ 2013-06-28 16:09 戒色 阅读(9420) 评论(1) 推荐(1) 编辑

2013年6月27日 #

摘要: Singleton单例模式Singleton 是对全局变量的取代策略作用:保证一个类只能有一个实例,并提供一个全局唯一的访问点。仅有一个实例:通过类的静态成员变量来体现。提供访问它的全局访问点:访问静态成员变量的静态成员函数来体现。《设计模式》一书中给出了一种很不错的实现,定义一个单例类,使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法获取该实例。单例模式通过类本身来管理其唯一实例,这种特性提供了解决问题的方法。唯一的实例是类的一个普通对象,但设计这个类时,让它只能创建一个实例并提供对此实例的全局访问。唯一实例类Singleton在静态成员函数中隐藏创建实例的操作。习惯上把这个 阅读全文
posted @ 2013-06-27 13:21 戒色 阅读(14270) 评论(4) 推荐(3) 编辑

2013年6月26日 #

摘要: AbstractFactory要创建一组相关或者相互依赖的对象作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。UML结构图:抽象基类:1)AbstractProductA、AbstractProductB:分别代表两种不同类型的产品,由具体的产品派生类对其实现2)AbstractFactory:抽象工厂类,提供创建两种产品的接口CreateProductA和CreateProductB,由派生的各个具体工厂类对其实现说明:AbstractFactory模式关键就是将这一组对象的创建封装到一个用于创建对象的类(ConcreteFactory)中Abstract Fact 阅读全文
posted @ 2013-06-26 16:06 戒色 阅读(8079) 评论(0) 推荐(1) 编辑

2013年6月25日 #

摘要: Factory1、定义创建对象的接口,封装对象的创建2、将实际创建工作延迟到子类中,例如,类A中药使用类B,B是抽象父类,但是在类A中不知道具体要实例化哪一个B的子类,但是在类A的子类D中是可以知道的。在A中无法使用 new B***()方法3、将创建工作延迟到子类中后,核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂,只提供工厂子类必须实现的接口,这样的好处是可以不用修改已有的工厂类的情况下增加新的产品(每一种产品,都分别对应相应的工厂子类负责其创建工作) 使用场景:用于一类类(所创建的产品继承共同的产品基类)的创建实现方式1:所谓的工厂方法模式,对每一个子类产品都分别对应一个工厂子 阅读全文
posted @ 2013-06-25 14:46 戒色 阅读(13708) 评论(3) 推荐(2) 编辑

2013年6月7日 #

摘要: 引用就是变量的别名,对引用的所有操作,都是对其原变量的操作对变量声明一个引用,并不另外开辟内存单元,引用及原变量都代表同一变量单元声明一个引用时,必须同时使之初始化,即声明它代表哪一个变量int a;int &b = a;//只是声明它和原有变量之间的关系,并不分配内存单元声明一个变量的引用之后,在运行期间,该引用一直与其代表的变量相联系,不能再作为其他变量的引用如下:int a1,a2;int &b = a1;int &b = a2;//不对,又企图使b成为变量a2的引用引用并不是一种独立的数据类型,它必须与某种类型的数据相联系,必须指定它代表哪个变量,对其进行初始化 阅读全文
posted @ 2013-06-07 16:59 戒色 阅读(360) 评论(0) 推荐(0) 编辑

摘要: 1 class Student 2 { 3 public: 4 /*******************成员函数**************************/ 5 Student();//默认构造函数,若定义了有参构造函数,默认构造函数会被覆盖,需手动再定义,否则无法调用 6 ~Student();//析构函数 7 /*析构函数,在对象的生存期结束时自动执行 8 1、局部对象,在出作用域时执行其析构函数 9 2、静态局部对象:在程序执行结束或exit时执行10 3、全局对象:在程序执行结束或exit时执行11 */12 ... 阅读全文
posted @ 2013-06-07 10:31 戒色 阅读(309) 评论(0) 推荐(0) 编辑

2012年11月1日 #

摘要: 查看进程及子进程:ps -lax查看进程,以及父进程。找到自己需要查看的进程的pid,然后ps --ppid ****---------------------ps -ef |grep进程名ps -aux |grep 进程名ps --ppid xxxx ps -laxtop--------------------------得到进程的pid: ps -ef | grep process_name | grep -v "grep" | awk '{print $2}'查看进程的所有线程 # ps mp 6648 -o THREAD,tid USER %CPU 阅读全文
posted @ 2012-11-01 08:42 戒色 阅读(2372) 评论(0) 推荐(0) 编辑

2012年7月24日 #

摘要: 对象的赋值与复制: 赋值:通过“ = ”运算符重载User a(10),b;b = a;复制:调用复制构造函数User b;User a(b);或者User a = b;//相当于User a(b);与赋值的区别,赋值是对一个已经存在的对象进行赋值(已经实现定义了被赋值的对象),而复制是从无到有建立一个新的对象,并使它与已有的对象相同。浅复制与深复制: 若对象中有指针成员,在复制时,只会将该指针成员的地址复制给新建立的对象,因此,两个对象中的指针成员都指向了同一块内存区域,在释放时会出现重复释放的问题。 需要手动定义复制构造函数,在构造函数中将为指针变量分配新的内存,是不同对象的指针成员指向不 阅读全文
posted @ 2012-07-24 00:08 戒色 阅读(695) 评论(0) 推荐(0) 编辑

2012年7月23日 #

摘要: 值传递方式:1、普通调用,形参与实参为同样的类型fun(int i)()fun(Student stud)()main(){ fun(1);Student s1; fun1(s1);}在函数中可以修改形参的值,但不能改变其对应的实参的值(形参的值变化无法传送到实参) 原因:在函数调用时将建立一个新的对象,是实参对象的拷贝,实参与形参分别占有不同的存储空间,无论形参是否修改都不会改变实参的值。 这种形式的虚实结合,会产生实参的拷贝。当传递的对象较大时,时间开销和空间开销都比较大。2、使用指针作为函数参数fun(int * i){}fun(Student * stud){}main(){ int 阅读全文
posted @ 2012-07-23 22:59 戒色 阅读(5142) 评论(0) 推荐(0) 编辑

2012年7月12日 #

摘要: C++中的异常类只能捕获普通异常,无法捕获内存异常,除数为零等错误。而后期语言,如java、C#能捕获所有错误,包括内存异常等。以下为C++的简单异常处理类:通过继承实现异常处理1、定义异常基类2、定义具体异常类,继承基类3、给具体异常类异常信息赋值 1 /*通过继承实现异常处理 2 1、定义异常基类 3 2、定义具体异常类,继承基类 4 3、给具体异常类异常信息赋值 5 */ 6 class Exception 7 { 8 public: 9 Exception()10 {11 }12 string ErrorMsg;13 string ErrorC... 阅读全文
posted @ 2012-07-12 22:28 戒色 阅读(825) 评论(0) 推荐(0) 编辑

2012年7月11日 #

摘要: C语言表达式/自增运算符:int a = 4;(++a) += (a++);中a值计算的思考!摘自:http://hi.baidu.com/tomorrowguy/blog/item/cd83cdfbb2236e7e024f5611.html 其实说实话,这个表达式根本不具有实用性,而且其很有可能在不同的编译器下有着不同的解释,从而运行出不同的结果,极其不推荐使用这种写法,当然如果你想知道清楚,那希望你有耐心看我我的东西。。。 首先给出我的测试结果:测试代码:#include<stdio.h>void main(){inta=4,b=4,c=4,d=4,e=4,f=4,g=4,h= 阅读全文
posted @ 2012-07-11 23:19 戒色 阅读(1639) 评论(0) 推荐(0) 编辑

2012年7月5日 #

摘要: 继承 阅读全文
posted @ 2012-07-05 20:16 戒色 阅读(163) 评论(0) 推荐(0) 编辑

摘要: 代码如下View Code 1 #include <iostream> 2 #include <fstream> 3 #include <sstream> 4 5 using namespace std; 6 class Student 7 { 8 public: 9 int sId; 10 char sName[10]; 11 }; 12 13 //申明模版类 14 template <typename T> 15 class Link 16 { 17 private: 18 Link * pHead; 19 Link * pCur;... 阅读全文
posted @ 2012-07-05 20:00 戒色 阅读(474) 评论(0) 推荐(0) 编辑

2012年7月3日 #

摘要: 构造函数:用以对类中数据成员进行初始化系统会自动生成默认构造函数(参数为空),但是若手动定义了带参的构造函数,会自动覆盖默认构造函数时若需要调用默认构造函数进行实例化,需要手动定义一个不带参的构造函数初始化列表:可通过初始化列表的方式对类数据成员进行初始化,如定义初始化列表:User():sId(0001),sSex(1)继承基类时在派生类中调用基类的构造函数,对基类进行初始化,实际上就是初始化列表。构造函数可以只在类体内声明,在类体外定义,且声明时不需要初始化列表,在定义时需要给出初始化列表(若有)。 有两种情况需要初始化列表: 数据成员中有常量成员:const int Id; 数据成... 阅读全文
posted @ 2012-07-03 07:37 戒色 阅读(728) 评论(0) 推荐(0) 编辑

摘要: 从系统实现的角度看,多态性分为两种,静态多态性与动态多态性静态多态性:函数重载、运算符重载(本质上也是函数重载);动态多态性:在程序运行过程中才动态地确定操作所针对的对象,又称为运行时的多态性,一般通过虚函数(virtual function)实现。C++通过虚函数与指向基类的指针一起来实现多态:当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数,因此在派生类中重新声明该虚函数时,可以加virtual,也可以不加,但最好加virtual,使程序清晰。如果在派生类中没有对基类中的虚函数重新定义,则派生类继承其直接基类的虚函数。静态关联:在编译时即可确定其调用的虚函数属于哪一个类 阅读全文
posted @ 2012-07-03 00:06 戒色 阅读(346) 评论(0) 推荐(0) 编辑

2012年6月27日 #

摘要: 1、死循环实现:View Code 1 //二分法查找 2 /********************算法描述*********************** 3 假设一个没有重复的序列 4 1、确定小大边界,小边界初始为0,大边界初始为length,以及中间边界 5 2、将查找的数字与小大中比较,如果刚好等于,则返回 6 3、如果比中间边界的值小,则小边界不变,中间边界作为大边界 7 4、否则中间边界作为小边界,大边界不变 8 补充,如果大边界-大边界的差为1,则不需要继续比较了,返回没有找到 9 5、循环到2 10 *************************************. 阅读全文
posted @ 2012-06-27 23:39 戒色 阅读(233) 评论(0) 推荐(0) 编辑

摘要: 1 //二分法折半插入排序 2 /*折半插入算法思想 3 1、初始化:设定有序区为第一个元素,设定无序区为后面所有元素 4 2、依次取无序区的每个元素 5 3、通过二分法查找有序区,返回比这个数小的最大数 6 4、保留此位置数据 7 5、从此位置的元素到有序区的最后一个元素,依次后移 8 6、用保留的数据填充此位置 9 */10 void sortByInsertHalf(int array[],int arraySize)11 {12 int iMax,iMid,iMin;13 for(int i=1;i<arraySize;i++)14 {15 i... 阅读全文
posted @ 2012-06-27 23:18 戒色 阅读(498) 评论(0) 推荐(0) 编辑

2012年6月26日 #

摘要: 1 //冒泡排序 2 /*******************算法描述********************** 3 1、遍历无序序列,依次取这个数和它的下一个数进行比较,如果这个数比下数大,则交换 4 2、循环1,直到length次数(我们称之为趟数)为止, 5 补充1:如果其中任何一趟,没有发生交换,则表示排序成功 6 补充2:其中每一趟,因为最大值已经放在最后了,所以从效率上来说,应该比较次数少一次 7 *************************************************/ 8 void sortByBubble(int array[],int leng. 阅读全文
posted @ 2012-06-26 23:31 戒色 阅读(329) 评论(0) 推荐(0) 编辑

摘要: 1 //交换排序 2 /*******************算法描述********************** 3 1、从第一个元素开始,依次与后续每个元素两两比较,若比后续元素大,则交换 4 2、循环:从第二个元素开始,重复上述动作1 5 *************************************************/ 6 void sortByExchange(int array[],int length) 7 { 8 int iTemp; 9 for(int i=0;i<length;i++)10 {11 for(int ... 阅读全文
posted @ 2012-06-26 22:42 戒色 阅读(236) 评论(0) 推荐(0) 编辑

摘要: 1 //选择排序(选择无序区最小值) 2 /**********算法描述*********************************** 3 //1、依次取无序区中的第一个元素array[i] i=0 to length,与后续元素中的最小值比较 4 //2、若比后续中的最小值大,则交换该值array[i]与最小值 5 //循环1: i++ 6 ******************************************************/ 7 void sortBySelect(int array[],int length) 8 { 9 int iMinInde... 阅读全文
posted @ 2012-06-26 22:10 戒色 阅读(343) 评论(0) 推荐(0) 编辑