- 博客(412)
- 资源 (49)
- 问答 (8)
- 收藏
- 关注
原创 Effective C++之 Item 43: 了解如何访问 templatized base classes(模板化基类)中的名字
假设我们要写一个应用程序,它可以把消息传送到几个不同的公司去。消息既可以以加密方式也可以以明文(不加密)的方式传送。如果我们有足够的信息在编译期间确定哪个消息将要发送给哪个公司,我们就可以用一个 template-based(模板基)来解决问题:class CompanyA {public: ... void sendCleartext(const std::string&...
2019-11-10 07:55:10 177
原创 Effective C++之 Item 42: 理解 typename 的两个含义
问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同?template<class T> class Widget; // uses "class"template<typename T> class Widget; // uses "typ...
2019-11-10 07:54:36 149
原创 Effective C++之 Item 41: 理解 implicit interfaces(隐式接口)和 compile-time polymorphism(编译期多态)
object-oriented programming(面向对象编程)的世界是围绕着 explicit interfaces(显式接口)和 runtime polymorphism(执行期多态)为中心的。例如,给出下面这个(没有什么意义的)class(类),class Widget {public: Widget(); virtual ~Widget(); virtual st...
2019-11-10 07:53:59 293
原创 Effective C++之 Item 40: 谨慎使用 multiple inheritance(多继承)
触及 multiple inheritance (MI)(多继承)的时候,C++ 社区就会鲜明地分裂为两个基本的阵营。一个阵营认为如果 single inheritance (SI)(单继承)是有好处的,multiple inheritance(多继承)一定更有好处。另一个阵营认为 single inheritance(单继承)有好处,但是多继承引起的麻烦使它得不偿失。在这个 Item 中,我们...
2019-11-10 07:53:19 211
原创 Effective C++之 Item 39: 谨慎使用 private inheritance(私有继承)
Item 32 论述了 C++ 将 public inheritance(公有继承)视为一个 is-a 关系。当给定一个 hierarchy(继承体系),其中有一个 class Student 从一个 class Person 公有继承,当为了成功调用一个函数而必需时,就要将 Students 隐式转型为 Persons,它通过向编译器展示来做到这一点。用 private inheritance...
2019-11-10 07:51:48 292
原创 Effective C++之 Item 38: 通过 composition(复合)模拟 "has-a"(有一个)或 "is-implemented-in-terms-of"(是根据……实现的)
composition(复合)是在 objects of one type(一个类型的对象)包含 objects of another type(另一个类型的对象)时,types(类型)之间的关系。例如:class Address { ... }; // where someone livesclass PhoneNumber { ... };class Pe...
2019-11-10 07:50:59 182
原创 Effective C++之 Item 37: 绝不要重定义一个函数的 inherited default parameter value(通过继承得到的缺省参数值)
我们直接着手简化这个话题。只有两种函数能被你 inherit(继承):virtual(虚拟的)和 non-virtual(非虚拟的)。然而,重定义一个 inherited non-virtual function(通过继承得到的非虚拟函数)永远都是一个错误(参见 Item 36),所以我们可以安全地将我们的讨论限制在你继承了一个 virtual function with a default p...
2019-11-10 07:50:24 79
原创 Effective C++之 Item 36: 绝不要重定义一个 inherited non-virtual function(通过继承得到的非虚拟函数)
假设我告诉你 class(类)D 从 class(类)B publicly derived(公有继承),而且在 class(类)B 中定义了一个 public member function(公有成员函数)mf。mf 的参数和返回值类型是无关紧要的,所以我们就假设它们都是 void。换句话说,我的意思是:class B {public: void mf(); ...};class D: ...
2019-11-10 07:48:25 156
原创 Effective C++之 Item 35: 考虑可选的 virtual functions(虚拟函数)的替代方法
现在你工作在一个视频游戏上,你在游戏中为角色设计了一个 hierarchy(继承体系)。你的游戏中有着变化多端的恶劣环境,角色被伤害或者其它的健康状态降低的情况并不罕见。因此你决定提供一个 member function(成员函数)healthValue,它返回一个象征角色健康状况如何的整数。因为不同的角色计算健康值的方法可能不同,将 healthValue 声明为 virtual(虚拟)似乎是...
2019-11-10 07:47:44 117
原创 Effective C++之 Item 34: 区分 inheritance of interface(接口继承)和 inheritance of implementation(实现继
(public) inheritance 这个表面上简单易懂的观念,一旦被近距离审视,就会被证明是由两个相互独立的部分组成的:inheritance of function interfaces(函数接口的继承)和 inheritance of function implementations(函数实现的继承)。这两种 inheritance 之间的差异正好符合本书 Introduction 中...
2019-11-10 07:46:44 103
原创 Effective C++之 Item 37: 绝不要重定义一个函数的 inherited default parameter value(通过继承得到的缺省参数值)
我们直接着手简化这个话题。只有两种函数能被你 inherit(继承):virtual(虚拟的)和 non-virtual(非虚拟的)。然而,重定义一个 inherited non-virtual function(通过继承得到的非虚拟函数)永远都是一个错误(参见 Item 36),所以我们可以安全地将我们的讨论限制在你继承了一个 virtual function with a default p...
2019-11-09 22:27:08 145
原创 Effective C++之 Item 34 区分 inheritance of interface(接口继承)和 inheritance of implementation(实现继承)
(public) inheritance 这个表面上简单易懂的观念,一旦被近距离审视,就会被证明是由两个相互独立的部分组成的:inheritance of function interfaces(函数接口的继承)和 inheritance of function implementations(函数实现的继承)。这两种 inheritance 之间的差异正好符合本书 Introduction 中...
2019-11-09 20:36:08 212
原创 Effective C++之 Item 33: 避免覆盖(hiding)“通过继承得到的名字”
莎士比亚有一个关于名字的说法。"What's in a name?" 他问道,"A rose by any other name would smell as sweet."(语出《罗密欧与朱丽叶》第二幕第二场,朱生豪先生译为:“姓名本来是没有意义的;我们叫做玫瑰的这一种花,要是换了个名字,他的香味还是同样的芬芳。”梁实秋先生译为:“姓算什么?我们所谓有玫瑰,换个名字,还是一样的香。”——译者注...
2019-11-09 20:13:05 251
原创 Effective C++之 Item 32: 确保 public inheritance 模拟 "is-a"
在 Some Must Watch While Some Must Sleep (W. H. Freeman and Company, 1974) 这本书中,William Dement 讲述了一个他试图让他的学生的记住他的课程中最重要的东西的故事。书中声称,他告诉他的班级,一般的英国中小学生对于 1066 年发生的 Hastings 战争的历史并没有什么了解。他着重强调,如果一个孩子记住了一点...
2019-11-09 19:53:35 168
原创 Effective C++之 Item 31: 最小化文件之间的编译依赖
你进入到你的程序中,并对一个类的实现进行了细微的改变。提醒你一下,不是类的接口,只是实现,仅仅是 private 的东西。然后你重建(rebuild)这个程序,预计这个任务应该只花费几秒钟。毕竟只有一个类被改变。你在 Build 上点击或者键入 make(或者其它等价行为),接着你被惊呆了,继而被郁闷,就像你突然意识到整个世界都被重新编译和连接!当这样的事情发生的时候,你不讨厌它吗?问题在于...
2019-11-09 19:28:44 200
原创 Effective C++之 Item 30: 理解 inline 化的介入和排除
inline 函数——多么棒的主意啊!它们看起来像函数,它们产生的效果也像函数,它们在各方面都比宏好得太多太多(参见 Item 2),而你却可以在调用它们时不招致函数调用的成本。你还有什么更多的要求呢?实际上你得到的可能比你想的更多,因为避免函数调用的成本只是故事的一部分。在典型情况下,编译器的优化是为了一段连续的没有函数调用的代码设计的,所以当你 inline 化一个函数,你可能就使得编译器...
2019-11-09 19:27:55 122
原创 Effective C++之 Item 29: 争取异常安全(exception-safe)的代码
异常安全(Exception safety)有点像怀孕(pregnancy)……但是,请把这个想法先控制一会儿。我们还不能真正地议论生育(reproduction),直到我们排除万难渡过求爱时期(courtship)。(此段作者使用的 3 个词均有双关含义,pregnancy 也可理解为富有意义,reproduction 也可理解为再现,再生,courtship 也可理解为争取,谋求。为了与后面...
2019-11-08 13:11:23 470
原创 Effective C++之 Item 28: 避免返回对象内部构件的“句柄”
假设你正在一个包含矩形的应用程序上工作。每一个矩形都可以用它的左上角和右下角表示出来。为了将一个 Rectangle 对象保持在较小状态,你可能决定那些点的定义的域不应该包含在 Rectangle 本身之中,更合适的做法是放在一个由 Rectangle 指向的辅助的结构体中:class Point { // class for representin...
2019-11-08 09:58:54 96
原创 Effective C++之 Item 27: 将强制转型减到最少
C++ 的规则设计为保证不会发生类型错误。在理论上,如果你的程序想顺利地通过编译,你就不应该试图对任何对象做任何不安全的或无意义的操作。这是一个非常有价值的保证,你不应该轻易地放弃它。不幸的是,强制转型破坏了类型系统。它会引起各种各样的麻烦,其中一些容易被察觉,另一些则格外地微妙。如果你从 C,Java,或 C# 转到 C++,请一定注意,因为强制转型在那些语言中比在 C++ 中更有必要,危...
2019-11-08 09:34:52 130
原创 Effective C++之 Item 26: 只要有可能就推迟变量定义
只要你定义了一个带有构造函数和析构函数的类型的变量,当控制流程到达变量定义的时候会使你担负构造成本,而当变量离开作用域的时候会使你担负析构成本。如果有无用变量造成这一成本,你就要尽你所能去避免它。你可能认为你从来不会定义无用的变量,但是也许你应该再想一想。考虑下面这个函数,只要 password 的长度满足要求,它就返回一个 password 的加密版本。如果 password 太短,函数就...
2019-11-08 09:34:04 61
原创 Effective C++之 Item 25: 考虑支持不抛异常的 swap
swap 是一个有趣的函数。最早作为 STL 的一部分被引入,后来它成为异常安全编程(exception-safe programming)的支柱(参见 Item 29)和压制自赋值可能性的通用机制(参见 Item 11)。因为 swap 太有用了,所以正确地实现它非常重要,但是伴随它的不同寻常的重要性而来的,是一系列不同寻常的复杂性。在本 Item 中,我们就来研究一下这些复杂性究竟是什么样的...
2019-11-07 17:47:36 100
原创 Effective C++之 Item 24: 当类型转换应该用于所有参数时,声明为非成员函数
让一个类支持隐式类型转换通常是一个不好的主意。当然,这条规则有一些例外,最普通的一种就是在创建数值类型时。例如,如果你设计一个用来表现有理数的类,允许从整数到有理数的隐式转换看上去并非不合理。这的确不比 C++ 的内建类型从 int 到 double 的转换更不合理(而且比 C++ 的内建类型从 double 到 int 的转换合理得多)。在这种情况下,你可以用这种方法开始你的 Rational...
2019-11-07 17:29:13 90
原创 Effective C++之 Item 23: 用非成员非友元函数取代成员函数
想象一个象征 web 浏览器的类。在大量的函数中,这样一个类也许会提供清空已下载成分的缓存。清空已访问 URLs 的历史,以及从系统移除所有 cookies 的功能:class WebBrowser {public: ... void clearCache(); void clearHistory(); void removeCookies(); ...};很多用户希望能一起执...
2019-11-07 16:16:32 132
原创 Effective C++之 Item 22: 将数据成员声明为 private
好了,先公布一下计划。首先,我们将看看为什么数据成员不应该声明为 public。然后,我们将看到所有反对 public 数据成员的理由同样适用于 protected 数据成员。这就导出了数据成员应该是 private 的结论,至此,我们就结束了。那么,public 数据成员,为什么不呢?我们从先从语法一致性开始(参见 Item 18)。如果数据成员不是 public 的,客户访问一个对象...
2019-11-07 15:03:50 133
原创 Effective C++之 Item 21: 当你必须返回一个对象时不要试图返回一个引用
一旦程序员抓住对象传值的效率隐忧(参见 Item 20),很多人就会成为狂热的圣战分子,誓要根除传值的罪恶,无论它隐藏多深。他们不屈不挠地追求传引用的纯度,但他们全都犯了一个致命的错误:他们开始传递并不存在的对象的引用。这可不是什么好事。考虑一个代表有理数的类,包含一个将两个有理数相乘的函数:class Rational {public: Rational(int numerato...
2019-11-07 13:30:52 94
原创 Effective C++之 Item 20: 用 pass-by-reference-to-const(传引用给 const)取代 pass-by-value(传值)
缺省情况下,C++ 以传值方式将对象传入或传出函数(这是一个从 C 继承来的特性)。除非你特别指定其它方式,否则函数的参数就会以实际参数(actual argument)的拷贝进行初始化,而函数的调用者会收到函数返回值的一个拷贝。这个拷贝由对象的拷贝构造函数生成。这就使得传值(pass-by-value)成为一个代价不菲的操作。例如,考虑下面这个类层级结构:class Person {pu...
2019-11-07 12:16:05 139
原创 Effective C++之 Item 19: 视类设计为类型设计
在 C++ 中,就像其它面向对象编程语言,可以通过定义一个新的类来定义一个新的类型。作为一个 C++ 开发者,你的大量时间就这样花费在增大你的类型系统。这意味着你不仅仅是一个类的设计者,而且是一个类型的设计者。重载函数和运算符,控制内存分配和回收,定义对象的初始化和终结过程——这些全在你的掌控之中。因此你应该在类设计中倾注大量心血,接近语言设计者在语言内建类型的设计中所倾注的大量心血。设计良...
2019-11-07 12:15:09 94
原创 Effective C++之 Item 18: 使接口易于正确使用,而难以错误使用
C++ 被淹没于接口中。函数接口、类接口、模板接口。每一个接口都意味着客户的代码和你的代码互相影响。假设你在和通情达理的人打交道,那些客户也想做好工作。他们想要正确使用你的接口。在这种情况下,如果他们犯了一个错误,就说明你的接口至少有部分是不完善的。在理想情况下,如果一个接口的一种尝试的用法不符合客户的预期,代码将无法编译,反过来,如果代码可以编译,那么它做的就是客户想要的。开发易于正确使用...
2019-11-06 17:15:49 73
原创 Effective C++之 Item 18: 使接口易于正确使用,而难以错误使用
C++ 被淹没于接口中。函数接口、类接口、模板接口。每一个接口都意味着客户的代码和你的代码互相影响。假设你在和通情达理的人打交道,那些客户也想做好工作。他们想要正确使用你的接口。在这种情况下,如果他们犯了一个错误,就说明你的接口至少有部分是不完善的。在理想情况下,如果一个接口的一种尝试的用法不符合客户的预期,代码将无法编译,反过来,如果代码可以编译,那么它做的就是客户想要的。开发易于正确使用...
2019-11-06 17:15:18 89
原创 Effective C++之 Item 17: 在一个独立的语句中将 new 出来的对象存入智能指针
假设我们有一个函数取得我们的处理优先级,而第二个函数根据优先级针对动态分配的 Widget 做一些处理:int priority();void processWidget(std::tr1::shared_ptr<Widget> pw, int priority);不要忘记使用对象管理资源的至理名言(参见 Item 13),processWidget 为处理动态分配的 Wid...
2019-11-06 16:57:54 67
原创 Effective C++之 Item 16: 使用相同形式的 new 和 delete
下面这段代码有什么问题?std::string *stringArray = new std::string[100];...delete stringArray;每件事看起来都很正常。也为 new 搭配了一个 delete。但是,仍然有某件事情彻底错了。程序的行为是未定义的。直到最后,stringArray 指向的 100 个 string 对象中的 99 个不太可能被完全销毁,因为它...
2019-11-06 16:00:16 71
原创 Effective C++之 Item 15: 在资源管理类中准备访问裸资源(raw resources)
资源管理类真是太棒了。他们是你防御资源泄漏的防波堤,没有这样的泄漏是设计良好的系统的基本特征。在一个完美的世界中,你可以在所有与资源的交互中依赖这样的类,从来不需要因为直接访问裸资源(raw resources)而玷污你的手。但是这个世界并不完美,很多 API 直接涉及资源,所以除非你计划坚决放弃使用这样的 API(这种事很少会成为实际),否则,你就要经常绕过资源管理类而直接处理裸资源(raw ...
2019-11-06 15:40:22 303
原创 Effective C++之 Item 14: 谨慎考虑资源管理类的拷贝行为
Item 13 介绍了作为资源管理类支柱的 Resource Acquisition Is Initialization (RAII) 原则,并描述了 auto_ptr 和 tr1::shared_ptr 在基于堆的资源上运用这一原则的表现。然而,并非所有的资源都是基于堆的,对于这样的资源,像 auto_ptr 和 tr1::shared_ptr 这样的智能指针通常就不像 resource ha...
2019-11-06 14:39:39 88
原创 Effective C++之 Item 13: 使用对象管理资源
假设我们和一个投资(例如,股票,债券等)模型库一起工作,各种各样的投资形式从一个根类 Investment 派生出来:class Investment { ... }; // root class of hierarchy of // investment types进一步假设这个库使用了通过一...
2019-11-06 13:51:25 76
原创 Effective C++之 Item 13: 使用对象管理资源
假设我们和一个投资(例如,股票,债券等)模型库一起工作,各种各样的投资形式从一个根类 Investment 派生出来:class Investment { ... }; // root class of hierarchy of // investment types进一步假设这个库使用了通过一...
2019-11-06 13:46:54 86
原创 Effective C++之 Item 13: 使用对象管理资源
假设我们和一个投资(例如,股票,债券等)模型库一起工作,各种各样的投资形式从一个根类 Investment 派生出来:class Investment { ... }; // root class of hierarchy of // investment types进一步假设这个库使用了通过一...
2019-11-06 13:46:18 58
原创 Effective C++之 Item 12: 拷贝一个对象的所有组成部分
在设计良好的面向对象系统中,封装了对象内部的配件,仅留两个函数用于对象的拷贝:一般称为拷贝构造函数(copy constructor)和拷贝赋值运算符(copy assignment operator)。我们将它们统称为拷贝函数(copying functions)。Item 5 讲述了如果需要,编译器会生成拷贝函数,而且阐明了编译器生成的版本正象你所期望的:它们拷贝被拷贝对象的全部数据。当...
2019-11-06 13:45:42 65
原创 Effective C++之 Item 11: 在 operator= 中处理 assignment to self(自赋值)
当一个 object(对象)赋值给自己的时候就发生了一次 assignment to self(自赋值):class Widget { ... };Widget w;...w = w; // assignment to self这看起来很愚蠢,但它是合法的,所以应该确信客户会这样做。另外,assignment(...
2019-11-05 08:40:59 161
原创 Effective C++之 Item 11: 在 operator= 中处理 assignment to self(自赋值)
当一个 object(对象)赋值给自己的时候就发生了一次 assignment to self(自赋值):class Widget { ... };Widget w;...w = w; // assignment to self这看起来很愚蠢,但它是合法的,所以应该确信客户会这样做。另外,assignment(...
2019-11-05 08:40:28 239
原创 Effective C++之 Item 10: 让 assignment operators(赋值运算符)返回一个 reference to *this(引向 *this 的引用)
关于 assignments(赋值)的一件有意思的事情是你可以把它们穿成一串。int x, y, z;x = y = z = 15; // chain of assignments另一件有意思的事情是 assignment(赋值)是 right-associative(右结合)的,所以,上面的赋值串可以解析成这样:x = (y = (...
2019-11-05 08:39:22 194
slickedit2014 V19
2015-02-01
gvim编辑器 加强版vim
2012-04-15
total commander
2012-03-29
Unix网络编程实用技术与实例分析
2011-11-06
毕业设计论文:电子信息管理系统
2010-04-24
sourceinsight4.0.0085
2017-04-10
C++ Concurrency_In_Action c++11多线程编程
2017-03-01
slickedit 2016(v21) pro crack 破解
2016-11-25
xshell V4.0
2015-07-08
小新v4000安装win10系统,请问如何修改默认快捷键?
2015-10-14
linux上slickedit如何调试守护进程?有么有调试过的?能否详细说明下
2015-08-27
centos6.5 64位上gdb调试无法使用了
2015-06-25
net-snmp中通过subagent方法,如何把多个Table编译成一个可执行文件?
2015-06-09
net-snmp在agent端如何实现MODE_GETNEXT的代码?
2015-06-03
net-snmp表中数据的获取、添加、修改、删除是怎么实现的?
2015-06-01
TA创建的收藏夹 TA关注的收藏夹
TA关注的人