- 博客(14)
- 资源 (5)
- 收藏
- 关注
翻译 Item13: Use objects to manage resources
假设我们使用一个用来建模投资行为(例如股票、债券等等)的程序库,其中各式各样的投资类型继承自一个root class Investment:class Investment { ... }; // root class of hierarchy of // investment types
2010-05-14 09:06:00
265
翻译 Chapter3: Resource Management
所谓资源就是,一旦用了它,将来必须还给系统。C++程序中最常使用的资源就是动态分配内存(如果你分配内存却从来不曾归还它,会导致内存泄露),但内存只是你必须管理的众多资源之一。其他常见的资源还包括文件描述器(file descriptors)、互斥锁(mutex locks)、图形界面中的字形和笔刷、数据库连接、以及网络sockets。不论哪一种资源,重要的是,当你不再使用它时,必须将它还给系统。
2010-05-14 09:02:00
259
翻译 Item12: Copy all parts of an object
设计良好的面向对象系统(OO-systems)会将对象的内部封装起来,只留两个函数负责对象拷贝(复制),那就是copy构造函数和copy assignment操作符,我们称之为copying函数。 如果你声明自己的copying函数,意思就是告诉编译器你不喜欢缺省实现中的某些行为。编译器仿佛被冒犯似的,会以一种奇怪的方式回敬:当你的实现代码几乎必然出错时却不告诉你。 考虑一个cla
2010-05-14 08:39:00
440
翻译 Item11: Handle assignment to self in operator=
Widget& Widget::operator=(Widget rhs) // rhs is a copy of the object{ // passed in — note pass by val swap(rhs); // swap *th
2010-05-13 20:18:00
303
翻译 Item10: Have assignment operators return a reference to *this
关于赋值,有趣的是你可以把它们写成连锁形式:int x, y, z;x = y = z = 15; // chain of assignments 同样有趣的是,赋值采用右结合律,所以上述连锁赋值被解析为:x = (y = (z = 15)); 15先赋值给z,然后其结果(更新后的z)再被赋值
2010-05-13 19:56:00
292
翻译 Item9: Never call virtual functions during construction or destruction
你不该在构造函数和析构函数期间调用virtual函数。 现有一个class,建模股市交易如买进、卖出的订单等。这样的交易一定要经过审计,所以每当创建一个交易对象,在审计日志(audit log)中也需要创建一笔适当记录,下面是一个看起来颇为合理的做法:class Transaction { // base class for
2010-05-13 16:47:00
358
翻译 Item8: Prevent exceptions from leaving destructors
C++并不禁止析构函数吐出异常。但不鼓励你这么做。这是有理由的:class Widget {public: ... ~Widget() { ... } // assume this might emit an exception};void doSomething(){ std::vector v; ...}
2010-05-13 16:06:00
266
翻译 Item7: Declare destructors virtual in polymorphic base classes
看一个计时类:class TimeKeeper {public: TimeKeeper(); ~TimeKeeper(); ...};class AtomicClock: public TimeKeeper { ... };class WaterClock: public TimeKeeper { ... };
2010-05-12 19:23:00
321
1
翻译 Item6:Explicitly disallow the use of compiler-generated functions you do not want.
如果你不想使用编译器自动生成的函数,就明确拒绝 一个描述待售房屋的class:class HomeForSale {...}; 由于任何一笔资产都是天上地下独一无二,没有二笔完全相像。因此为HomeForSale对象做一份副本有点没有道理。你怎么可以复制某些先天独一无二的东西呢?HomeForSale h1;HomeForSale h2;HomeForSale h3(
2010-05-11 22:07:00
379
1
翻译 Item5: Know what functions C++ silently writes and calls
什么时候一个空类(empty class)不再是一个空类(empty class)呢?当C++处理过它之后。如果你自己不声明,编译器就会为你声明(一个编译器版本)的一个copy constructor、一个copy assignment操作符、一个析构函数。此外,如果你没有声明任何构造函数(constructor),编译器还会为你生成一个默认构造函数(default constructor)。所有
2010-05-11 14:41:00
263
翻译 Chapter2. Constructors, Destructors, and Assignment Operators
几乎你写的每一个class都会有一个或多个构造函数、一个析构函数、一个copy assignment操作符。
2010-05-11 14:37:00
233
翻译 Item4: Make sure that objects are initialized before they're used
于初始化对象的值,C++似乎反复无常。如果你这么写 int x; 在某些语境下,x会被初始化为0,但其他语境中却不保证。如果你这么写class Point { int x, y;};...Point p; p的成员变量有时候被初始化为0,有时候不会。 现在,我们终于有一些规则,描述“对象的初始化动作何时一定发生,何时不一定发生”。不
2010-05-07 14:11:00
290
翻译 Item3: Use const whenever possible
使用const允许你指定一个语义限制---特定的对象不允许被修改---编译器会强制这项约束。它允许你告诉编译器或其他编码人员某个值应该保持不变。 关键字const是多才多艺的。你可以用它在class外修饰global或namespace scope作用域内的常量,或者修饰文件、函数、区块作用域中被声明为static的对象。你也可以修饰class内部的static和n
2010-05-06 09:34:00
411
翻译 Effective C++ Item 2:Prefer constS, enumS, and inlineS to #defineS
这个条款叫“喜欢编译器胜过预处理器”更贴切。因为#define不被视为语言的一部分。当你这样写时, #define ASPECT_RATIO 1.653 符号名ASPECT_RATIO对于编译器来讲是不可见的;在源程序到达编译器之前,ASPECT_RATIO很可能被预处理器删除了。所以,ASPECT_RATIO符号名也许压根就没有进入符号表。这就会使你很困惑了,特别编译过程中涉
2010-05-05 15:37:00
412
国际大学生程序设计竞赛例题解 广东省大学生程序设计竞赛试题(二)(2003年-2005年)
2008-09-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人