其实大师scott在书中很多东西已经描述的很详细了。
不过作为个人学习笔记,纪录一下针对自身有深刻印象的章节,
做一个摘要,
以便于时刻提醒自己。
要熟读兵书,并把它转变为自己的一部分,加以灵活运用,真还不是一件特别容易的事情。
可能需要对语言有充分深刻的理解,再加上更多的工作实践经验才有可能成为现实。
条款1:View C++ as a federation of languages
今天的C++已经是一个多重泛型编程语言,一个同时支持procedual, object-oriented, functional,
generic, metaprogramming的语言。你可以把C++看成由以下四部分组成: C, Object-Oriented C++, Template
C++, STL。
条款6:Explicitly disallow the use of complier-generated functions you do not want.
当你没有定义默认构造函数,拷贝构造函数(copy),拷贝赋值函数(copy assignment),析构函数时,编译
器会为你生成他们。
但是在某些情况下,可能你不需要这些函数,例如你禁止某个对象产生拷贝动作等。
将“拷贝构造函数”和“拷贝赋值函数”声明为private。通过自己声明这些函数,你阻止编译器为你生成他们
,而零这些函数为private,使得你阻止外部用户调用他们。
进一步,将他们声明为private,并且不实现它们。这样不仅外部用户不能使用它们,同时成员函数,以及友元
函数也不能使用它们。
条款7: Declare destructors virtual in polymorphic base classes.
当一个类设计的目的是用来实现多态的,那么它应该声明一个virtual 析构函数,否则在实现多态时,删除一
个对象时,因为函数名称覆盖,造成基类析构函数不能被调用,从而将产生资源泄漏。 如果类带有任何virtual函
数时,它都必须拥有一个virtual析构函数。
当一个类的设计目的不是作为base class使用。例如它仅仅是定义了一个行为,想让其他人都使用和拥有这种
能力。那么他不应该声明virtual 析构函数。 虚函数的实现不是免费的午餐,有时间和空间代价的。
条款11: Handle assignment to self in operator=.
1)当对于某个类实现“=”操作符时,要特别注意自我赋值。特别是当对象包含指针对象时。因为在赋值操作时
,通常我们会首先释放老对象上持有的资源,例如某个指针指向的某块内存。 然后再将新值赋值给它。 但是当一
个包含指针的对象自我赋值时,前一步操作已将指针所指空间释放,指针是一个野指针,那么后面的赋值就错误存
在。
例如下面一个类
class Bitmap{ };
class Widget{
...
private:
Bitmap * pb; //指针,指向一块保存Bitmap对象的内存空间。
};
2)有时候自我赋值是不容易发现的。
*pa = *pb; //当pa, pb指向同一个对象时,就发生了自我赋值操作,但是这是相当隐蔽的,很不容易被发现。
3)解决办法,还是请看书上的详细描述吧,^_^。
条款18: Make interfaces easy to use correctly and hard to use incorrectly.
任何接口如果要求客户必须记住某些事情,就是有着“不正确使用”的倾向,因为客户可能会忘记做一些事情。
一旦忘记做一些事情,就有可能会引发错误,例如资源泄漏等。
例如一个创造对象的“工厂函数”,它返回一个指针指向Investment继承体系内的一个动态分配对象:
Investment * createInvestment();
为了避免资源泄漏,createInvestment的返回的指针最终必须被删除,但那至少开启了两个客户错误机会:1)
没有删除指针; 2)删除同一个指针超过一次。
面对这个问题的一个解决办法是使用智能指针,例如auto_ptr,或者tr1::shared_ptr。
本文摘录了C++大师Scott著作中的几个关键编程准则,包括将C++视为多种语言的联合体、显式禁止不需要的编译器生成函数、在多态基类中声明虚析构函数、处理自赋值问题及设计易于正确使用的接口。
6876

被折叠的 条评论
为什么被折叠?



