C++高效编程忠告续

闲来无聊,无聊一下:

2 头文件的作用
这是由于历史原因造成的。
头文件主要用于存放接口声明,以便不同的c文件共享函数声明。
到了c++中,已经造成一种妨碍了。

3 * & 的位置
这个位置放哪,虽然要紧,但更要紧的是,遵守一个变量一行定义。这样就不会出现错误,也很好读。如:
int * i;
int j;

4 if
仍然是历史原因造成的。c标准中没有真正的bool类型(c++98和c99加了),而是用int来代替,这就造成了麻烦。所以新写的程序要避免使用BOOL,而用bool来替代。
如果是旧标准的编译器,仍然要注意BOOL其实是int这个要点。

5 const #define enum
这几个各有用途,有时候也不能互代。使用时,优先顺序 enum const #define。看具体要求,不一定非要怎么怎么样。

6 参数传递
用指针或用引用,倒不定要要争个谁好谁坏。
实际上,用指针还更容易让人明白传进去的是指针。而引用则不然。引用的引入,在c++中是为了解决运算符重载的问题。
不过,不管用哪个,倒是建议优先采用 const T* 或const T&,这种常量指针或常亘引用。这不仅关系程序优化,也关系到代码的质量。

8 memcpy
除非没有类似的库函数,否则不要重新写一个。要知道,绝大多数编译器会对这些库函数作特殊优化。这是手工编码无法做到的。

11 字串
建议不要使用strcpy,strcmp类似的函数,应该改为strncpy, strncmp等函数。目前新型的编译器会认为strxxx函数是非法的(被淘汰的),建议用strnxxx,或者编译器提供的更安全的版本。

13 指针的大小
与编译器及系统平台有关。大小从2/4/8/16各种可能性都有.不要认死了。

14 关于new/delete 与malloc/free
你用了类似class的关键字后,就注定不兼容于c了。因此,用了c++的东西,就不要去用mallco/free,除非特殊情况。
同理,不使用c++的东西,也决不要去用new /delete.
否则,你的跨语言或跨平台的想法就打水漂了。还容易出错。

15 const 函数
const不一定只能引用const成员。它可以使用任何成员,只是默认情况不能改变成员的值而已。如果成员被定义为mutable(c++98),则不限制。

18 #ifdef
说的太绝对了。而且没有任何说明如何做。

事实上#ifdef能做的事还是挺多的




三、* , &修饰符的位置
int* & rY = pI; // ptr's ref
用int*表示指针更清楚。

int *i,j;
我更倾向于这样分开写:
int * pI;
int j;

六、C++函数中值的传递方式
“如果输入参数是以值传递的话,最好使用引用传递代替”
应该是“如果输入参数是常量值的话,最好使用常量引用传递代替”。
但是简单常量就不需要引用传递。

十二、sizeof的问题
一般没有这样定义函数的:
void fun(char a[1000])
而是void fun(char * p, int len)


目前C++有3种编程:c, 类, 模板。
其中,头文件对于c来说,并不成问题,甚至还带来许多便利。
但是对于类,和模板,特别是模板来说,麻烦就大了。

对于类来说,封装性和实现隐藏是一个很重要的概念,但大多数情况下,许多人都不容易做到这一点。.h文件中会有许多私有的数据成员,甚至还有不少的函数实现(如inline函数),从而对封装性和实现隐藏造成破坏,造成编译依赖,进一步造成编译器的复杂度提高。最终为了避开这些问题,将会造成库设计要求的提高。

至于模板风格的编程就更不得了,目前几乎没有支持分离模板的编译器。况且即便分离了,又能怎么样?最终的结果是,大多的模板风格的程序,所有的代码都在.h文件中,.cpp反而只剩了一句话:#include "xxx.h",没了。


本文出自:http://www.cppblog.com/mzty/archive/2007/07/19/28359.html

你可能感兴趣的:(C++高效编程忠告续)