自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

不积跬步无以至千里

不积跬步无以至千里

  • 博客(26)
  • 收藏
  • 关注

原创 设计模式:门面模式

门面模式(外观模式):将子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。1)它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。(2)它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。(3)如果应用需要,它并不限制它们使用子系统类。举例,高级语言程序编译的过程:预处理、编译、汇编

2016-01-31 12:06:16 312

原创 设计模式:组合模式

组合模式(Composite):1 将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。2 当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。3 组合模式屏蔽对象内部的细节,对外展现统一的方式来操作对象。例如一个总公司由子公司和各个部门

2016-01-30 22:45:13 325

原创 设计模式:桥接模式

举个例子,现在比如有10种类型的战士(Fighter),20种类型的武器(Weapon),如果我们采用从一个抽象的Fighter类派生出配备不同武器的战士的话,我们需要10*20=200种子类,这种方法非常不合理,因为如果我们想在抽象类种添加一个抽象方法的话,就必须对这200种子类进行重定义。桥接模式适合解决这种问题,现在让我们把战士和武器分开,分别派生出10种战士和20种武器,通过Fight

2016-01-29 10:41:40 297

原创 设计模式:适配器模式

适配器模式:电压适配器能将220v的电压,调整到手机充电要求的的5v电压,所以称之为适配器。1 在软件开发过程中,如果某个模块的功能开发起来非常困难,但是此前已经有相同功能的模块存在了,只是这两个模块的接口不一致,利用适配器模式就能够用目标接口封装好已经存在的接口,降低开发的难度。适配器模式可以实现对现有类(功能)的包装,直接使用,而不必重新开发。2 调用者和提供者都不太容易修改的情况

2016-01-28 13:18:41 488

原创 忙等待的互斥

竞争条件:两个或多个进程读取某些共享数据,最后的结果取决于进程运行的精确时序,成为竞争条件。互斥:当一个进程在使用一个共享变量或文件时,其他进程不能做同样的操作。临界区:对共享内存进行访问的程序片段成为临界区。实现互斥,避免竞争条件的方法:1 屏蔽中断,cpu将不会切换到其他进程。但不适合多核系统,而且把屏蔽中断的权利交给用户进程是不明智的。2 锁变量,初始

2016-01-27 14:56:52 5215

原创 设计模式:原型模式

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。1 假设我们现有一个对象,但是它的类型需要运行期确定,我们不知道它的动态类型是什么,现在我们想创建它的副本。显然通过构造函数创建是很麻烦的,这时候我们可以使用原型模式中的clone函数直接得到该对象的副本。2 有些时候我们想要得到某个状态下的副本,用构造函数显然很难确定参数应该是什么,但是利用clone可以轻易得

2016-01-27 10:50:06 344

原创 设计模式:建造者模式

建造者模式:1  建造一个对象,这个对象是由复杂的部件构成,但它需要哪几个部件是固定的,每种部件的生产方式不固定。2  建造者模式将对象的生产和部件的生产分离开,分别用Director类和Builder类来实现。比如组装一个机器人人,他需要6个部分,头,双手,双脚,躯干,我们先把这6个部分生产出来,最后把6各部分组装在一起。#includeusing namespace std;

2016-01-26 12:58:55 331

原创 设计模式:单例模式

单例模式即保证类只能有一个实例,比如一个系统日志就需要使用单例模式;单例模式中将类的构造函数声明为private或protected,保证类外无法声明该类的对象,然后提供一个公有的静态方法获取私有的静态成员。虽然可以利用全局变量,程序中所有地方都能使用,但是全局变量不能确保只有一个实例。#includeusing namespace std;class Singleton{ public

2016-01-25 13:21:24 280

原创 不要对数组和指针运算使用多态

先看下面的程序:#includeusing namespace std;class Animal{ private: char* name; public: Animal(){} Animal(char* tmp){ name=tmp; } virtual ~Animal(){} friend ostream& operator<<(ostream&ou

2016-01-24 20:31:31 557

原创 设计模式:工厂模式

一   简单工厂模式假设现在需要创建很多类型的对象,程序中各个地方大量的使用new会给程序管理带来很大的麻烦,简单工厂模式就是通过创建一个工厂类,用这个工厂类来生产各种不同类型的产品。在工厂类中根据需要的产品类型,进行生产产品,所以事先需要将创建产品的代码放入工厂类中。#includeusing namespace std;enum ProductType{ TypeA, Type

2016-01-24 11:21:29 337

原创 多继承与单继承实现代码复用

比如有一个Animal类,类中有一个函数attack(),现在要从Animal派生出另外两个子类Tiger和Lion类,起初可以这么设计:class Animal { public: virtual void attack(){}};class Tiger:public Animal{ public: virtual void attack();};class Lion:p

2016-01-23 15:29:36 884

原创 虚函数继承的默认缺省参数

永远不要重新定义虚函数继承的默认缺省参数,因为虚函数具有动态绑定特性但是默认缺省参数却具有静态绑定特性。如果重新定义了默认参数,就会出现混乱,比如下面程序:#includeusing namespace std;class Animal { public: virtual void getClass(char* type="animal") { cout<<type<<en

2016-01-22 14:49:46 871

原创 接口继承与实现继承

继承可以从两方面理解:1接口继承,只继承函数的接口(声明),需要在派生类中定义继承过来的纯虚函数。2实现继承,同时继承接口与实现,可以重新定义继承的函数,也可以不重新定义。另外还有:子类不能重新定义继承的函数,这类函数就是普通的函数,非虚函数。class Animal { public: virtual void attack()=0; virtual void ge

2016-01-22 14:09:36 831

原创 返回类的内部数据带来的问题

如果一个成员函数返回类的内部数据,那么这个数据就可能被其他程序修改,比如下面这个类:#include#includeusing namespace std;class String{ public: String(){ data=new char[1]; data=NULL; } String(const char* ch){ data=new char[

2016-01-21 13:01:04 301

原创 传值与传引用

传引用相比于传值具有以下优点:1.能够避免拷贝构造函数和析构函数的调用开销;2.能够避免将派生类对象传递给基类形参时产生的切割现象,切割现象会将派生类所具有的特性都切割掉,变成一个简单的基类对象。#includeusing namespace std;class Base{ public: Base(){} virtual void display(){ cout<

2016-01-20 21:23:57 381

原创 C++类继承下的赋值运算符

class Base { public: Base& operator=(const Base& rhy); Base(int val=0); private: int value;};//编译器禁止声明和定义时同时定义缺省参数值。//若声明时没有定义缺省参数值,那么在定义成员函数时可以定义缺省参数值。但这种情况通常用户是看不见的,因此应避免。Base::Base(int

2016-01-20 15:16:12 3497 1

原创 C++小题(十五)

/*有如下程序段:#include using namespace std; class A { public: ~A() { cout << "~A()"; }};class B{ public: virtual ~B() { cout << "~B()";}};class C: public A, publi

2016-01-17 13:58:58 1056

原创 C++小题(十四)

/*#include命令的功能是()。正确答案: C 在命令处插入一个头文件在文件首部插入一个头文件在命令处插入一个文本文件在文件首部插入一个程序文件预处理器发现#include后,就会寻找指令后面<>中的文件名,并把这个文件的内容包含到当前的文件中,被包含的文件中的文本将替换源代码文件中的#include指令*/////////////////////////////

2016-01-10 13:32:20 1151

原创 C++小题(十三)

/*#include命令的功能是()。正确答案: C 在命令处插入一个头文件在文件首部插入一个头文件在命令处插入一个文本文件在文件首部插入一个程序文件预处理器发现#include后,就会寻找指令后面<>中的文件名,并把这个文件的内容包含到当前的文件中,被包含的文件中的文本将替换源代码文件中的#include指令*/////////////////////////////

2016-01-09 12:44:36 833

原创 C++小题(十二)

/////////////////////////////////////////////////////////////////////////*以下有关C语言的说法中,错误的是________。正确答案: D 你的答案: D (正确)a内存泄露一般是指程序申请了一块内存,使用完后,没有及时将这块内存释放,从而导致程序占用大量内存。b无法通过malloc(size_t)函数调用申

2016-01-07 13:07:55 1218

原创 C++小题(十一)

/*下列 C 代码中,不属于未定义行为的有:______。正确答案: C A int i=0;i=(i++);B char *p=”hello”;p[1]=’E’C char *p=”hello”;char ch=*p++D int i=0;printf(“%d%d\n”,i++ i--)E 都是未定义行为F 都不是未定义行为*//////////////////////

2016-01-06 18:46:50 644

原创 C++小题(十)

/*设x、y、t均为int型变量,则执行语句:t=3; x=y=2; t=x++||++y; 后,变量t和y的值分别为____t=1 y=2*//////////////////////////////////////////////////////////////////////*C++中,下面四个表达式中错误的一项是()正确答案: C a+=(a++)a+=(++a)

2016-01-05 14:09:02 816

原创 C++小题(九)

/*下面程序段的运行结果是()int main(int argc, char *argv[]){ char *s = "abcdefg"; s += 2; fprintf(stderr, "%d\n", s); return 0;}正确答案: C 你的答案: C (正确)cde字符"c"字符"c"的地址不确定stdout -- 标准输出

2016-01-03 15:16:55 1076

原创 C++小题(八)

//////////////////////////////////////////////////////////////*字符串"Hello"会被输出几次?int main() { printf("Hello"); fork(); printf("Hello");}正确答案: C 你的答案: C (正确)A2B3C4D6print输出字符串如果不是一"\n"为结尾

2016-01-02 14:05:39 925

原创 OpenCV笔记(十四)

图像修补#include#include#includeusing namespace cv;using namespace std;Mat srcImage1,inpaintMask;Point previousPoint(-1,-1);void on_mouse(int event,int x,int y,int flags,void*){ if(event==EVENT

2016-01-01 17:21:53 697

原创 C++小题(七)

/////////////////////////////////////////////////////////////////////////////////////*关于代码输出正确的结果是()int main(int argc, char *argv[]){ string a="hello world"; string b=a; if (a.c_str()=

2016-01-01 15:22:14 1096

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除