- 博客(70)
- 资源 (6)
- 收藏
- 关注
原创 关于模板特化在不同的命名空间的问题
昨天晚上写代码的时候遇到了这样一个问题://enumstring.hnamespace util{ template const char* EnumString(const T) { return ""; }}//test.cpp#include "enumstring.h"namespace debugger{ using namspace util; template const char* EnumString(cons
2010-06-08 09:40:00
2179
原创 条款55(最一款):让自己熟悉Boost
条款55(最一款):让自己熟悉Boost Familiarize yourself with Boost. 本款是本书的最后一款,主要介绍了Boost库.书里面介绍的很详细,我在这里就不想再次累赘介绍了,有兴趣的可以阅读原书的内容.我只把原书中关于本款要记住的要点帖出来. 请记住: ■ Boost是一个社群,也是一个网站.致力于免费、源码开发、同僚复审的C++程
2009-10-28 14:21:00
908
原创 条款54:让自己熟悉包括TR1在内的标准程序库
条款54:让自己熟悉包括TR1在内的标准程序库 Familiarize yourself with the standard library,including TR1. 本款原书主要介绍了标准程序库和TR1程序库.书里面介绍的很详细,我在这里就不想再次累赘介绍了,有兴趣的可以阅读原书的内容.我只把原书中关于本款要记住的要点帖出来: 请记住: ■ C++标准程序
2009-10-28 14:14:00
809
原创 条款53:不要轻忽编译器的警告
条款53:不要轻忽编译器的警告 Pay attention to compiler warnings. 许多程序员习惯性地忽略编译器警告.他们任务如果是问题真的很严重的话,编译器就应该给一个错误提示信息而不是警告信息.这种想法看起来似乎很合理,但是在C++语言上,我觉得编译器作者对代码即将会爆发的事情应该比你有更加深入的理解,你说呢?下面我举的这个例子是多多少少在大部人身上都发生过
2009-10-28 14:00:00
767
原创 条款52:写了placement new也要写placement delete
条款52:写了placement new也要写placement delete Write placement delete if you write placement new. 我们都知道当你在写一个new表达式像这样: Widget* new_widget = new Widget; 共有两个函数被调用:一个是用以分配内存的operator new,一个是Widg
2009-10-28 11:12:00
2359
原创 条款51:编写new和delete时需固守常规
条款51:编写new和delete时需固守常规 Adhere to convention when writing new and delete. 大家好,前一条款我们已经讨论了你在什么时候想要写个自定义的operator new和operator delete,但并没有解释当你这么做时必须遵守什么规则.我先来总体说一下,然后再分析这些规则. 要实现一致性operator
2009-10-27 15:39:00
1002
原创 条款50:了解new和delete的合理替换时机
条款50:了解new和delete的合理替换时机 Understand when it makes sense to replace new and delete. 怎么会有人想要替换编译器提供的operator new或operator delete呢?我们可以列出如下三个常见的理由: ■ 用来检测运用上的错误. 程序员从开始编写代码到调试直至最终完成,这
2009-10-27 10:39:00
939
原创 条款49:了解new-handler的行为
条款49:了解new-handler的行为 Understand the behavior of the new-handler. 在我们平时的编写代码过程中,总是避免不了去new出一些对象出来.我们知道new操作符私底下通过调用operator new来实现内存分配的.当operator new抛出异常以反映一个未获满足的内存需求之前,它会调用一个客户指定的错误处理函
2009-10-26 16:04:00
876
转载 条款48:认识template元编程
条款48:认识template元编程 Be aware of template metaprogramming. Template metaprogramming(TMPS,模板元编程)是编写template-based C++程序并执行编译期的过程.它本质上是以C++写成、执行于C++编译器内的程序.一旦TMP程序结束执行,其输出,也就是从templates具现出来的若干C++源
2009-10-23 11:11:00
1143
原创 条款47:请使用traits classes表现类型信息(2)
条款47:请使用traits classes表现类型信息(2) Use traits classes for information about types. 大家好,上一篇我们讨论了如何设计和实现traits classes,本篇将继续前面讨论来讲述如何使用traits classes来表现类型信息.好,我们现在有了iterator_traits,我们可以可以这样来实现advan
2009-10-22 20:52:00
929
原创 条款47:请使用traits classes表现类型信息(1)
条款47:请使用traits classes表现类型信息(1) Use traits classes for information about types. 今天我们讨论的这款内容涉及到一个STL实现上的一个关键技术traits技术,简单的说就是类的型别判定技术.由于本条款要讨论内容比较多,所以我将分成两篇文章来表述,今天我们只讨论traits classes的实现,明天我将讨论
2009-10-22 16:29:00
840
原创 条款46:需要类型转换时请为模板定义非成员函数
条款46:需要类型转换时请为模板定义非成员函数 Define non-member functions inside templates when type conversion are desired. 还记得在条款24中,我们提到只有non-member函数才有能力在所有实参身上实施隐式类型转换.今天我们讨论的东西与该条款相关,如果现在的你恰好忘记了前面这条款的内容,那
2009-10-21 21:09:00
1035
转载 [DirectDraw]显示模式
(转自:http://web.mblogger.cn/www/club/topic_12_11852.htm) ● 关于显示模式 显示模式指的是显示器的当前设置,描述了显示器的分辨率和位深度,这个信息通常是由显示硬件从主页面传递给显示器的。显示模式是由三个特征定义的:宽、高、位深度。例如,大多数的显示器可以显示宽为640像素、高为480像素的图象,每一个像素的位深度是
2009-09-09 10:56:00
2584
原创 条款45:运用成员函数模板接受所有兼容类型
条款44:运用成员函数模板接受所有兼容类型(Use member function templates to accept "all compatible types.")内容: 不知道大家注意到没有,在类的继承体系中,对象指针一直在为我们做一件很好的事情:支持隐式转换(implicit conversions).Derived class指针可以隐式转换为base class指针,"指
2009-09-03 10:31:00
910
原创 条款44:将与参数无关的代码抽离templates
条款44:将与参数无关的代码抽离templates(Factor parameter-independent code out of templates.)内容: 自从我们进入模板编程的第一天,我们就意识到template不仅大大地减少了代码的执行时间,而且能够避免代码潜在的重复.我们不在需要为20个相似的classes而每一个都带有15个成员函数编写独立的一份代码去分别实现,我们只需
2009-08-31 11:27:00
1016
原创 条款43:学习处理模板化基类内的名称
条款43:学习处理模板化基类内的名称(Know how to access names in templatized base classes.)内容: 现在我们接到一个编码任务,任务要求我们的目标程序能够传送信息到不同的公司去.这里的信息可以分为:被译成密码的信息和未经加工信息明文信息.我们分析了任务以后认为,在目标程序的编译期间我们就可以决定哪一个信息传送至哪一家公司.所以我们采用
2009-08-30 15:16:00
868
转载 类之间的关系
类之间的关系 (转自:http://www.cnblogs.com/floodpeak/archive/2008/02/27/1083533.html) 内容: 网上关于此类的讨论非常多,发现对于该问题的理解各有各的说法,而各个说法中又相去甚远。通过浏览这些讨论以及对>的参考,发表一下自己的看法. 类间关系有很多种,在大的类别上可以分为两种:纵向关系、横向关系。 纵向关系
2009-08-27 14:50:00
599
原创 条款42:了解typename的双重意义
条款42:了解typename的双重意义 Understand the two meanings of typename.内容: 看下面template声明式中,class与typename有什么不同? template class Widget;//use "class " template class Widget;//use "typename" 某些
2009-08-25 10:47:00
711
原创 条款40:明智而谨慎地使用多重继承
条款40:明智而谨慎地使用多重继承 Use multiple inheritance judiciously.内容: 当我们提到多重继承(multiple inheritance:MI)时,就不得不面对当前C++的两个基本阵营:一个认为单一继承SI(single inheritance) 是好的,MI一定更好!令一个阵营认为,SI是好的,但MI不值得我们去频繁使用.本款我们就带领大家来
2009-08-21 11:26:00
928
原创 条款39:明智而审慎地使用private继承
条款39:明智而审慎地使用private继承 Use private inheritance judiciously.内容: 前面的条款中我们谈到将public继承视为一种is-a关系,在这里你不免有产生一个疑问:那对于private继承,我们应该视为什么关系呢?我们来看下面这个测试: class Person{...}; class Student:private Pe
2009-08-20 10:51:00
1052
翻译 Windows 服务(3) (from MSDN)
◆服务配置程序 程序员和系统管理员使用服务配置程序修改或者查询已安装服务数据库.此数据库也可以通过使用注册函数来访问.但不管你使用何种方式,你应该只使用SCM配置函数,因为它能确保服务能够被正确的安装和配置. SCM配置函数要么需要一个SCManager对象句柄要么需要一个服务对象句柄.为了获得这些句柄,服务配置程序必须进行如下操作: (1)使用OpenSCM
2009-08-17 09:44:00
2524
翻译 Windows 服务(2) (from MSDN)
◆服务程序 一个服务程序包含了一个或多个服务的可执行代码.用SERVICE_WIN32_OWN_PROCESS类型创建的服务只包含了一个服务的可执行代码,而用SERVICE_WIN32_SHARE_PROCESS类型创建的服务包含了多个服务的可执行代码.服务不仅可以被配置在本地网域,主网域或者信任网域中执行,也可以运行在服务用户账户环境下. 接下来我们将分几个部分来介绍一些服务程序
2009-08-13 14:29:00
2257
翻译 Windows 服务(1) (from MSDN)
Windows服务(1) (翻译自MSDN)◆总述 如果一个服务应用程序遵循SCM(Service Control Manager)接口规范,那么系统登录用户就可以通过操作服务程序控制面板或者执行内部使用了服务函数(service function)的应用程序来使得该服务应用程序能够享受一种"特权"----改服务程序能够随系统启动而自动执行,甚至在用户没用登录的情况下也可以.而
2009-08-12 15:13:00
1274
原创 条款38:通过复合塑膜出has-a或"根据某物实现"
条款38:通过复合塑膜出has-a或"根据某物实现"内容: 所谓的复合就是类型之间的一种关系,它的基本的表现形式在我们平时的编写代码过程当中常常出现,比如你准备设计一个类的时候,你写出来的类的对象不是保护了其它的对象?呵呵,对了,这就叫复合.举个例子: class Address{...}; class PhoneNumber{...}; class P
2009-08-06 21:55:00
932
原创 条款37:绝不重新定义继承而来的缺省参数值
条款37:绝不重新定义继承而来的缺省参数值内容: 审视了一下条款以后,我们可以换一种说法:绝不重新定义继承而来的virtual函数或non-virtual函数的缺省参数值.而在上一款中我们提到,绝对不要试图去重新定义继承而来的non-virtual函数,将这句话与本条款合并的话,我们就可以将本条款的内容简化为:绝不重新定义继承而来的virtual函数的缺省参数值.为什么继承而来的vir
2009-08-04 15:22:00
2297
3
原创 条款36:绝对不要重新定义继承而来的non-virtual函数
条款36:绝对不要重新定义继承而来的non-virtual函数内容: 我们来看个例子,class B为基类,class D为public继承自B的子类: class B{ public: void func(){...} }; class D:public B{...} 接下来我们面对以下行为: D dObject;
2009-08-03 08:35:00
1041
2
原创 条款35: 考虑virtual函数以外的选择
条款35: 考虑virtual函数以外的选择 内容: 最近比较忙,好几天没更新了,今天拼了命抽出时间来补上,呵呵,废话就不多说了,进入正题。 假如现在你正在写一个游戏软件,游戏里面有各种游戏任务角色,人一多了嘛,就容易出现各个方面的利益冲突,而游戏设计者让他们解决冲突的直接方法就是--战斗,于是游戏中各种人物相互之间砍杀的画面就经常出现,这样就出现了由于受伤或者其它因素导致
2009-07-29 16:21:00
966
原创 条款34:区分接口继承和实现继承
条款34:区分接口继承和实现继承 Differentiate between inheritance of interface and inheritance of implementation 内容: 当你开始设计你的class时候,有时候你希望它的Derived class只继承它的
2009-07-15 13:43:00
810
原创 条款33:避免遮掩继承而来的名称
条款33:避免遮掩继承而来的名称 Avoid hiding inherited names. 内容: 相信大家对变量作用域的"名称遮掩"现象已经很熟悉了,比如下面这段代码: int x; //g
2009-07-14 11:19:00
784
原创 条款32:确定你的public继承塑模出is-a关系
条款32:确定你的public继承塑模出is-a关系 (Make sure public inheritance model is "is-a".)内容: 我想对于类之间的public继承关系,每一本C++语言教程都会花费不少的篇幅去阐述,而本款所说的内容也许你早已是耳熟能详了,但在实际编码涉及中你是否从本条款出发去认真地考虑过你的设计的合理性呢?我觉得大多数的人没有真正做到这一点
2009-07-07 10:20:00
896
原创 条款31:将文件间的编译依存关系降至最低
条款31:将文件间的编译依存关系降至最低 (Minimize compilation dependencies between files.)内容: 在你们的开发团队中,一些有经验的工程师时不时地会教导新手一些基本的编程原则,其中"将接口从实现中分离"可能是他(她)要你必须牢记原则,因为C++并没有把它做的很好,这只能靠我们在平时的编写代码中注意这一点了,如果你不小心违背了这一原则
2009-07-06 11:39:00
1244
原创 条款30:透彻了解inlining的里里外外
条款30:透彻了解inlining的里里外外 (Understand the ins and outs of inlining.)内容: 对于该款的描述,原文中用了6页的篇幅进行阐述,这里我就将重要的知识点罗列出来,方便大家更好的理解这一条款. (1)inline函数的优缺点. 优点:对于一个inline函数,你可以调用它们又不蒙受函数调用招致的额外开销,编译器就会对函
2009-07-03 10:31:00
1004
原创 条款29:为"异常安全"而努力是值得的
条款29:为"异常安全"而努力是值得的 (Strive for exception-safe code.) 内容: 看了这款的内容,我对C++的难以控制的"脾气"又有了进一步的了解,C++的安全性问题一直是广大非C++程序员所抨击C++语言"恶行"的主要方面,我们今天讨论的其"异常安全性"也是其复杂之处之一,看完这一款之后,你也许会发觉你以前写的代码可能会给最终产品带来多大的"风
2009-07-02 17:01:00
740
原创 条款28:避免返回handles指向对象内部成分
条款28:避免返回handles指向对象内部成分 (Avoid returning "handles" to object internals.)内容: 这里所谓的handles一般包括内部对象的references、pointer、iterator,这条款是如何产生的呢?理由是什么呢?我先不必急着回答你这些问题,我们先来看一个例子,假设我们的程序中要用到矩形,于是我们写了Rect
2009-07-01 16:11:00
766
原创 条款27:尽量少做转型动作
条款27:尽量少做转型动作 (Minimize casting.) 内容: 我们先来看一下转型语法,C风格的转型语法大概就是下面这种形式: (T)expression //将expression转换为T类型 函数转型语法如下: T(expression) ////将expression转换为T类型 这两种转型语法,我们称之为"旧式转型",既
2009-06-26 11:25:00
867
原创 条款26:尽可能延后变量定义式的出现时间
条款26:尽可能延后变量定义式的出现时间 (Postpone variable definitions as long as possible.)内容: 由于定义一个类变量时,你就必须承担起构造和析构的负担.所以我们要尽量减少定义一些我们不用的对象,估计你现在对这条约束很不在意,我不用它为啥要定义它,我定义对象变量后肯定我会用它的嘛,呵呵,话不要说的太早有些时候,你的"不留心"会"
2009-06-25 09:49:00
1002
1
原创 条款25:考虑写出一个不抛异常的swap函数
条款25:考虑写出一个不抛异常的swap函数(Consider support for a non-throwing swap.)内容: swap函数就是相互交换两个对象的内容,标准程序库中已经提供了该函数的实现版本,其实现过程也是那么的如你预期所愿: namespace std{ template void swap(T& a,T& b)
2009-06-24 14:59:00
1342
3
原创 条款24:若所有参数皆需类型转换,请为此采用non-member函数
条款24:若所有参数皆需类型转换,请为此采用non-member函数(Declare non-member functions when type conversions should apply to all parameters.)内容: 平时在我们的coding过程当中,我们有时候会碰到这样一些情况:我传进去的实参与声明函数的形参并不是同一类型的,函数调用竟然能够成功!这个听起来很
2009-06-24 08:30:00
943
2
原创 操作符重载函数多态性
内容: 在一次coding过程中,遇到这样一个问题:能不能显式声明用virtual修饰操作符重载的函数?呵呵,提出的问题是不是weird一点,但是此时并不否认有这样的想法也符合逻辑,好,那么我们来测试一下: #include using std::cout; using std::endl; class LimitValue{ public:
2009-06-22 14:41:00
697
原创 关于继承体系下的操作符重载问题讨论(二)
我们在上一篇的时候引入了一个问题:当不为我们的子类显式提供操作符重载函数实现,那么编译器为这个类提供的操作符重载的默认实现版本是否会调用基类的操作符实现函数呢?带着这个问题,我们依旧利用上一篇的代码进行测试,我们先注释掉该子类的操作符实现函数: class Day:public LimitValue{ public: Day(int days,int se
2009-06-22 13:55:00
1000
深度探索 c++对象模型 中文版
2008-12-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人