“Effective C++ Third Edition”学习笔记(一)

本文摘录了C++大师Scott著作中的几个关键编程准则,包括将C++视为多种语言的联合体、显式禁止不需要的编译器生成函数、在多态基类中声明虚析构函数、处理自赋值问题及设计易于正确使用的接口。

其实大师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。

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值