Effective C++学习笔记备忘

提示:本文是一篇个人读书笔记,并不是对原书内容的系统总结整理,可能对作者以外的读者没有太大的参考意义。

  目前对C++的了解还处于入门阶段,这本书真正看懂的内容大概只有一半左右。大部分条款和机制先建立一个印象,希望能在未来实际使用中再来回顾和加深理解。

条款02:

不允许在class内对static const类型变量赋值?替代方案是使用enum{NumTurns = 5};   (P14)

 

条款03:

1.const与指针(P17~18)

char greeting[]="Hello";
const char* p = greeting;//non-const pointer, const data
char* const p = greeting;//const pointer, non-const data
const char* const p =greeting; //const pointer, const data

决定哪个是常量与*和const二者位置相关。const *表示被指物是常量,* const表示指针自身是常量。常量Widget对象,下面两种意义相同:

void f1(const Widget* pw);
void f2(Widget const * pw);

2.const_cast和static_cast转型(P24)

 

条款04:

  member initalize list比构造函数为成员变量赋值效率通常更高,后者相当于调用了default构造函数为它们设初值,然后再赋予新值。(P28)

 

条款07:为多态基类声明virtual析构函数

  正如题名,这么做是为了经由base class指针删除derived class对象时把derived部分也一并销毁。(P41)

  把不带virtual析构函数的类作为基类是不明智的,比如string/vector/list/set/tr1::unordered_map等等。

 

条款11:在operator=中处理“自我赋值”

  方法一:判断两个操作数是否相同,比较耗费资源;

  方法二:swap()创建rhs的副本,并与this交换。

 

条款20:

  传递const引用可以避免传value引起的派生类被“切割”(slicing),不仅仅是高效。(P89)

 

条款27:

  使用容器存储直接指向derived class对象的指针(通常是智能指针)避免dynamic_cast。

 

条款30:

  inline函数如果改变,那么所用到的所有文件都需要重新编译;反之,non-inline函数改变时只需重新连接就好,比前者负担小得多。

 

条款43:

  template特化版:template<>语法,使得在参数为某一个时模板全特化。

你可能感兴趣的:(c++,读书)