快捷搜索:  
EffectiveC++2eItem26

EffectiveC++2eItem26

条款26: 当心潜在的二义性 每个人都有思想。有些人相信自由经济学,有些人相信来生。有些人甚至相信COBOL是一种真正的程序设计语言。C++也有一种思想:它认为潜在的二义性不是一种错误。 这是潜在二义性的一个例子: class B; // 对类B提前声明 // class A { public: A(const B); // 可以从B构造而来的类A }; class B { public: operator A() const; // 可以从A转换而来的类B }; 这些类的声明没一点错——他们可以在相同...

EffectiveC++2eItem27

EffectiveC++2eItem27

条款27: 如果不想使用隐式生成的函数就要显式地禁止它 假设想写一个类模板Array,它所生成的类除了可以进行上下限检查外,其它行为和C++标准数组一样。设计中面临的一个问题是怎么禁止掉Array对象之间的赋值操作,因为对标准C++数组来说赋值是不合法的: double values1[10]; double values2[10]; values1 = values2; // 错误! 对很多函数来说,这不是个问题。如果你不想使用某个函数,只用简单地不把它放进类中。然而,赋值运算符属于那种与众不同的成员...

面向对象技术的三大机制

面向对象技术的三大机制

封装、继承、多态是面向对象技术的三大机制,其中封装是基础,继承是关键,多态是延伸。 1. 封装 封装的对象是数据和方法,支持数据封装就是支持数据抽象。在c++中,类是支持数据封装的工具,对象则是数据封装的实现。没有封装,就没有面向对象技术。 另外,封装还提供一种对数据访问严格控制的机制。因此,数据将被隐藏在封装体中,该封装体通过操作接口与外界交换信息。 对象被说明为给定类的量。每个给定类的对象包含有这个类所规定的若干个私有成员和公有成员以及保护成员。 在C语言中可以定义结构,但这种结构只包含数据,而不包...

MFC基础-怎样贴一张圆型的位图

MFC基础-怎样贴一张圆型的位图

如果你要做有关棋类的东东又恰好有两张漂亮棋子的位图,可惜两张位图是方型的,后面有背景..在Delphi里只要将背景色设成透明就行了,可在MFC里怎样实现把背景去掉只显示圆形的棋子呢? 实例如下: //To invoke this function with the position BOOL IsBlack = TRUE;//set the black stone defautly CBitMap m_bStoneB; CBitMap m_bStoneW; //load bmp from resourc...

CMenu类的使用方法

CMenu类的使用方法

CMenu类从CObject类派生而来。为什么要使用CMenu类呢?AppWzard不是把菜单做好了吗?在资源编辑器上修改菜单不是很方便吗?我是个vc++初学者,自从当斑竹以来,天天看贴子,也学到了不少东西。感觉学vc++稍微深入一点好,至少要能搞清楚AppWizard在背后都干了些什么东西。 事实上mfc就是用CMenu类来生成菜单的。让我们就从CMenu开始吧。CMenu生成的菜单有两种:Popup类型和非Popup类型。这两种方法里又可以分成使用资源编辑器生成的菜单资源和不使用这个资源。对于非Po...

在Win  95任务栏上放置图标

在Win 95任务栏上放置图标

Windows 95(以下简称Win95)以其良好的用户界面深受广大用户喜爱。Win95启动后通过开始菜单或桌面上的快捷方式启动应用程序,一般情况下,当程序执行极小化操作后,程序将排列 到任务栏并以标题的形式显示,用户通过任务栏可以快速在各任务之间切换。但是对于那些针对系统时钟、设备状态或其它一些事件,如中文输入法等应用程序,其常见操作往往是说明当前时钟、设备或事件的状态以及在各状态之间的切换等。如果只是以标题的形式缩小到任务栏,用户需要查询和修改时需要重新激活应用程序窗口来操作,使用不方便。如果能像我...

Reactor模式中网络事件分派探讨

Reactor模式中网络事件分派探讨

对于使用线程池的Reactor模式,针对每一个SOCKET句柄的事件处理器handler可能被分派到不同的线程当中,这就要求handler的每一个操作都是线程安全的。 可以使用一种办法使一个handler的操作只能分派到一个线程中:为每一个handler设定一个线程所有者ID,一开始ID为空,则每个线程都可以分派,第一次分派之后,则设定为该线程ID,以后只分派到该线程中。这样,可以保证handler操作的单线程性,简化以后handler的具体实现。这个ID也可以灵活设置,以适应具体事务的要求。 但这样并不...

什么是Nagle  algoritm

什么是Nagle algoritm

简而言之,nagle算法主要目的是减少网络流量,当你发送的数据包太小时,TCP并不立即发送该数据包,而是缓存起来直到数据包 到达一定大小后才发送。(improving the efficiency of TCP/IP networks by reducing the number of packets that need to be sent over the network.) 关于这个算法,我觉得wikipedia上讲的比较好。具体点说,当上层提交数据给TCP时,TCP觉得你的数据太小了(套用一般的...

什么是delayed  ack  algorithm

什么是delayed ack algorithm

delayed ack algorithm也就是TCP/IP详解中所谓的"经受时延的确认"(翻译得真饶舌 = =||)。在RFC1122中提到delayed ack 的概念: " A host that is receiving a stream of TCP data segments can increase efficiency in both the Internet and the hosts by sending fewer than one ACK (acknowledgment) seg...

指向结构体数据的指针变量

指向结构体数据的指针变量

对使用指针来处理数据读者应有了一些体会,即先定义一以数据或元素类型为基类型的指针变量;其次在定义的指针变量与要处理的数据之间建立关联,让指针变量指向要处理的数据;然后引用指针指向变量来完成数据的处理。 使用指针来处理结构体数据也不例外,下面举例说明。 例指向结构体变量的指针变量的应用示例。 假设有一结构体,包含某人的姓名和年龄,用指向结构体变量的指针变量完成输出处理。 程序如下: /*程序10一13,指针应用于结构体*/ main() {struct person {char *name; int ag...

字符指针变量和字符数组的区别

字符指针变量和字符数组的区别

虽然用字符指针变量和字符数组都能表示和处理字符串,但它们二者之间是有区别的,不应混淆。 (1)字符数组由若干个元素组成,每个元素中存放字符串的一个字符,而字符指针变量中存放的是字符串的首地址。 (2)初始化方式不同。对字符数组初始化要用stati‘c存储类别,在编译时进行。而对字符指针变量初始化不必加static,在实际执行时进行。 (3)赋值方式不同。对字符数组不能整体赋值,只能转化成份量,对单个元素进行。而字符指针变量赋值可整体进行。例如: char s[10]; a= \"C++\";/*错,s是...

指向一维数组的指针变量

指向一维数组的指针变量

指向一维数组的指针变量,实际上是指向一维数组元素的指针变量。可以利用指向一维数组的指针变量,完成数组数据的操作处理,具体步骤如下: (1)定义与数组相同基类型的指针变量。即定义指向数组的指针变量。 (2)在指针变量与要处理的数组(元素)之间建立关联。只需将相应数组的首地址赋给指针变量。 (3)使用指针所指向的变量来完成数组元素(数组)的操作处理。 例如,要利用指针处理整型数组a: (1)int*p;/*定义指针变量*/ (2)p—a;或p=a[O];/*建立关联*/ p+i是下标为i的数组的元素地址。...