一年前读此书,在书上乱写乱画,自认为对C++懂了。现在正式从事编码工作,看了别人的代码才发现自己其实并没有懂得很多,因此,重新拾起之前的书,认认真真开始记录笔记。
0--序言
四个转型运算符:比如static_cast<int>(32.12)
const_cast:将对象或指针的常数型转型掉
dynamic_cast:用来执行"安全的向下转型动作"
reinterpret_cast:转型的结果取决于编译器
static_cast:没有其他合适的转型运算符可用,就用这个,和传统转型运算符最接近
Item 1 -- 尽量以const和inline取代#define
用const的好处是,调试时,可以直接获取变量,而非定义的数字,这个在使用gdb跟踪代码的时候很有用,比如#define NUM 123;如果在gdb中print NUM,会出现NUM找不到符号表的问题,这样在复杂表达式中出现NUM进行watch的时候要回去找NUM的具体值很郁闷。
使用const不仅如此,其不允许改动的语义才是其存在的精华, 常量指针和指针常量很容易让人弄混,来再记一遍,星号在中间,左定内容右定针。
const char *p; char const* p都表明p指向的内容不能变
char * const p 则表明指针不能变
再bt一点的就是牵扯到typedef了,typedef能够破坏const的语义,参考下面的链接
http://hi.baidu.com/%C6%AE%D4%DA%B1%B1%BE%A9/blog/item/92e3554e22307d0db2de0540.html
http://hi.baidu.com/xiaoshumuzi/blog/item/34ff22386487eaf8b311c716.html
抛弃#define使用inline的原因就是类似#define max(a,b) ((a)>(b)?(a):(b)) 这种写法除了使用无数括号很bt之外,max(++a,b)这个简单的表达式便可轻而易举废掉程序员的本意,这点足以放弃#define
Item 2 -- 尽量以<iostrem>取代<stdio.h>
EC(Effective c++)给出Item2的理由,cin/cout型别安全,比如Rational r; cout<<r在stdio.h中是无法想象的。当然,Rational要针对<<进行支持,有关写operator <<又是一个要讨论的Item,这里事先给出正确写法
class Rational{
friend ostream& operator<<(ostream&s, const Rational& r)
}
其实对于我这种学习的时候就使用cin/cout的人来讲,现在倒是感觉stdio.h这种东东很好玩,里面牵扯到fopen、fput、fwrite等等底层IO接口,深入研究也是对计算机IO更好的了解
Item 3 -- 尽量以new和delete取代malloc和free
new的过程:申请内存(也即malloc的作用),调用构造函数,返回对象指针(后面讲到operator new ,placement new都是基于这个基本知识)
另外,new和delete对应,malloc和free对应这个也是常识了,但是为啥呢?EC里面讲到,如果混用会导致不可预料的错误。
Item 4 -- 尽量使用C++风格的注释形式
其实就是相对/**/这种注释,多用用//,而//在VS2005以及Eclipse下面都有快捷键,VS2005是Ctrl+K,C(按住Ctrl,先后按K和C)取消是Ctrl+K,U,Eclipse则方便的多,只用Ctrl+/即可
说到注释,不能不提doxygen,最近也在看源代码,抽空得研究下,学习一下注释规范。简单搜索下,可以关注下面链接:
http://blog.163.com/jallyx/blog/static/5726580020097611042993/
http://zsxxsz.javaeye.com/blog/403539
http://www.lupaworld.com/action_viewstutorial_itemid_3735.html