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<>语法,使得在参数为某一个时模板全特化。
作者:五岳
出处:http://www.cnblogs.com/wuyuegb2312
对于标题未标注为“转载”的文章均为原创,其版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。