Effective C++ 读书笔记4

26 尽量延后变量定义式出现的时间
   这句话的意思是,只有确定能够用到这个变量时,才定义它。这样可以避免很多不必要的构造和析构

函数,如果一个对象只有构造函数和析构函数被调用,那么这个对象还有什么用呢。这跟c语言可不一样

,c要求所有的变量定义都要放在函数的开头。
  widget w;
  for(int i = 0; i < 10; i++)
  { 
    w = 取决于i的某个值
        ...
  }
 
  for(int i = 0; i < 10; i++)
  { 
    widget w(取决于i的某个值)
        ...
  }

 上面这个例子,哪个好呢?

28 避免返回handle指向对象的内部
  返回一个指向对象内部数据成员的引用或指针可能会带来两个问题
  一是对象析沟以后,这个引用和指针的行为就很危险了
  二是不利于数据的封装性

29 为异常安全的而努力是值得的
   frankly speaking,这节很难,我都没怎么看懂,先来看一下书中的代码
   void PrettyMenu::changeBackGround(std::istream &imgsrc)
   {
     lock(&mutex);
     delete bgImage;
     ++imagechanges;
     bgImage = new Image(imgsrc);
     lock(&mutex);
   }
   这段代码有什么问题?
   大多数人都能看出来,呵呵,我也能看出来,如果new失败,抛出异常,那么unlock就调用不了了。也

就是说,互斥变量就无法释放了。另外类的指针被删除了,计数统计也不对。
   书中概括的更好一些,异常安全是指要解决下面两个问题
    a.资源不泄漏
    b.不允许数据败坏
   如何来解决这一问题,我能想到的是用封装的Lock类来代替这个lock函数
   就是这样 Lock m(&mutex); 保证Lock能析构,然后把bgImage给一个temp值,先new,再delete
   书中提到的方法考虑的很多,最后设计出来也比较复杂,先把bgImage封装到一个智能指针里,然后又
用了copy-swap技术,就是先弄个临时变量,把智能指针里的内容全拷贝过来,然后再把新的bgImage放到

这个临时变量里,再做交换,说实话挺复杂的。


30 彻底了解inline的里里外外
   宏是在预编译的时候处理,就会把代码展开;而inline函数是在编译时处理,会做一些代码的生成和

优化。
   inline函数的好处,加快代码执行速度,因为不需要函数的调用,压栈入栈什么之类的操作。坏处是

增大了代码的大小,因为每一次调用inline编译器都要生成一段类似的代码。
   virtual函数不要申明为inline,因为virtual是运行期调用的
   递归函数不要inline
   对于构造和析构函数,书中的态度不是很明确,总的来说还是不提倡inline

31 将文件之间的编译依存关系降到最低
   这又是令人头疼的一节
   我觉得仅仅是因为build的时候要多编译一些代码,这不是一个问题。编译一个文件要多长时间,开发

整个代码要多长时间,两者的比率是很悬殊的。
   书中的思想是相依与声明式,不相依与定义式。
   很费解吧,我觉得说了两个问题,一个是能够用类的声明解决问题,不要用头文件;另一个是重新设计类,使得类的定义与其实现分开。
    对于二,书中给出了两种思路,一种是handler class 一种是interface classs   
   handler class 有一个pImpl指针,所有的事情都在Imply类中做,它不管
   interface classs 定义一个全虚函数的抽象基类,只是提供接口的定义,继承类具体实现
   哎,不是很好理解,C++大师的文笔虽然已经很通俗易懂了,但是手法还是那么让人望而生畏。
  
   
  
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值