读书笔记:Effective C++ 2.0 版 1997年Scott Meyers,条款1、2、3、4

目的:重新过一遍这本书。

条款1:尽量用const和inline而不用#define。尽量用编译器而不用预处理。

#define ASPECT_RATIO 1.653 //存在类型安全性问题
const double ASPECT_RATIO = 1.653; //类型安全,常量定义
const char * const authorName = "Scott Meyers"; //指针定义有两个const
class GamePlayer {
private:
	enum { NUM_TURNS = 5 } //
	static const int NUM_TURNS = 5; // constant eclaration 
	static const double FACTOR = 1.35;//
};
#define max(a,b) ((a) > (b) ? (a) : (b)) //max(++a, b) 出错
inline int max(int a, int b) { return a > b ? a : b; } //更安全,但只支持int
template<class T>
inline const T& max(const T& a, const T& b)
{ return a > b ? a : b; } //内联模板解决类型问题,与define等价,且安全

以上条款在cpp中可行。在c中也需要尽量参考。

条款2:尽量用而不用
类型安全和扩展性是C++的基石。
c函数安全性差些,但可控性更好,使用者需要自己做的事更多。

int i;
Rational r;// r 是个有理数
cin >> i >> r;
cout << i << r;
class Rational {
public:
	Rational(int numerator = 0, int denominator = 1);
private:
	int n, d;// 分子,分母
	friend ostream& operator<<(ostream& s, const Rational& );//自定义类型支持<<运算符
};
ostream& operator<<(ostream& s, const Rational& r){
	s<< r.n << '/' << r.d;
	return s;
}

个人不是完全支持这一条款,因为c语言风格的性能往往更好。cpp风格一般多了函数调用成本,但编译期实现是否可以通过内联完全优化掉,值得怀疑。
cpp的可移植性没有c好。
c语言把更多的事情交给了用户去决定,cpp方便了用户,但有所牺牲。

条款3:尽量用new和delete而不用malloc和free

这个不做过多解释,cpp的new、delete在编译期会自动加上构造析构函数的调用.
这个既是cpp的优点也是cpp的缺点,但既然用cpp,那就应该用new和delete。

malloc和free不需要区分是否是数组。new和delete需要区分有无[]。
不要混用new、delete、malloc、free。
对于大内存申请,地址尽量以4096为边界,另外尽量不用去memset 0,也尽量不要去构造析构。
大内存还是c风格更好,少了构造析构,也少了初始化0,没有初始化0也就没有真的获得内存。内存是在第一次被访问时才会被真的分配。
c语言还有realloc这种神器,背后的实现有待深入调查。realloc可以扩大也可以缩小申请的区域,甚至应该还有自动拷贝,自动内存整理回收,重新映射内存表。
void* calloc( size_t num, size_t size )不太一样,会自动初始化0,个人不太推荐这个自动初始化0

条款4:尽量使用c++风格的注释

c风格/*  ... */
cpp风格  //
老版本c编译器可能不认识 //  导致注释成为宏的内容。

待续…

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