最近项目高层软件从C语言切换C++开发,内部推荐阅读<Effective C++ Second Edition> 这本书。在此,对阅读过程中的一些所感所想做些记录。
对书中提到的一些C++开发条款和个人的理解,总结整理下笔记,以供参考。
第一章的主要内容是从C转向C++,这个比较适合笔者,因为一直以来就是用C语言开发的。
最初接触的是清华大学出版吕凤翥的<C++语言基础教程>,ISBN 7-302-03321-8,后来以学习谭浩强的经典版<C程序设计>,ISBN 7-302-03806-6 为主了。好了,不说这些了,就针对书中第一章的条款和例子,结合个人感触,整理一下几点:
条款1:“尽量用编译器而不用预处理” -- 例1:
#define ASPECT_RATIO 1.653
const double ASPECT_RATIO = 1.653;
评论:C语言宏定义在debug版本中,无法显示符号。C++定义常变量,经编译器处理后,ASPECT_RATIO会加入到符号列表中,便于编译报错和调试定位。
条款1:“尽量用编译器而不用预处理” -- 例2:
#define max(a,b) ((a) > (b) ? (a) : (b))
int a = 5, b = 0;
max(++a, b);// a 的值增加了2次
max(++a, b+10); // a 的值只增加了1次
评论:预处理宏定义函数仅仅是简单展开,与函数编译不可同日而语。尤其在C++中大量使用++/--单目运算符,简单宏定义展开会出现不可意料的情况。
条款1:“尽量用编译器而不用预处理” -- 问题1:
不管是#define还是inline,下面的代码行
a = max(x, y);
可能会被翻译成:
a = ((x) > (y) ? (x) : (y));
评论:inline函数,根据编译器不同,有时其表现形式和#define是一致的【1】。因此反而容易引起混淆,需要特别注意。
条款2:C++代码中尽量用<iostream>而不用<stdio.h>
1) scanf和printf很轻巧,很高效,是C语言封装的50年代打印输出代码
2) iostream类型安全,可扩展性强,是C++语言封装的特殊输出类
评论:C++的iostream输出需要类进行相应的友元函数支持,从系统架构出发,C++编程中应该尽量使用iostream。
条款3:尽量用new和delete而不用malloc和free
1) malloc和free不知道构造函数和析构函数。
2) new先申请内存,然后调用构造函数。
3) delete先调用析构函数,然后释放内存。
评论:需要理解new/delete和malloc/free的本质区别以及实现流程。
条款4:尽量使用c++风格的注释
评论:C++引入//注释,本人并不完全认同这种方式比C语言/* comment */要来的好。另外Effective C++中举的注释例子也并非是好的编程习惯。因此该条款,个人认为并非非常重要。
参考资料:
【1】http://en.wikipedia.org/wiki/Inline_function
注:后续阅读比较,将会尽快整理出来!
第一章:从C转向C++ (Effective C++ Second Edition 读书笔记)
第二章:内存管理(Effective C++ Second Edition 读书笔记)
第三章:构造函数,析构函数和赋值操作(Effective C++ Second Edition 读书笔记)
第四章 类和函数:设计与声明(Effective C++ Second Edition 读书笔记)
第五章 类和函数:实现(Effective C++ Second Edition 读书笔记)第六章 继承和面向对象设计 (Effective C++ Second Edition 读书笔记)