一、使用const和inline取代#define
1.使用const定义常量来代替预处理宏
- 定义一个常量:const double ASPECT_RATIO = 1.653
- 这种方法很有效。但有两个特殊情况要注意。
- 定义指针常量时会有点不同,因为常量定义一般是放在头文件中(许多源文件会包含它),除了指针所指的类型要定义成const外,重要的是指针也经常要定义成const。例如,要在头文件中定义一个基于char*的字符串常量,你要写两次const:
const char * const authorName = "Scott Meyers";
-定义某个类(class)的常量一般也很方便,只有一点点不同。要把常量限制在类中,首先要使它成为类的成员;为了保证常量最多只有一份拷贝,还要把它定义为静态成员:
class GamePlayer {
private:
static const int NUM_TURNS = 5; // constant eclaration
int scores[NUM_TURNS]; // use of constant
...
};
const int GamePlayer::NUM_TURNS;//在CPP中进行的定义
2.使用enum代替const定义数组的大小
class GamePlayer {
private:
enum { NUM_TURNS = 5 } // "the enum hack" — makes
// NUM_TURNS a symbolic name
// for 5
int scores[NUM_TURNS];// fine
};
3.使用inline代替#define,消除宏的负面影响
#defien max(a,b) ((a)>(b)?(a):(b))
template<typename T>
inline const T&max(const T &a,const T &b)
{
return a>b?a:b;
}
二、使用iostream代替stdio.h
如果使用了iostream,得到的是置于名字空间std下的iostream库的元素;如果使用iostream.h,得到的是置于全局空间的同样的元素。在全局空间获取元素会导致名字冲突,而设计名字空间的初衷正是用来避免这种名字冲突的发生。还有,打字时iostream比iostream.h少两个字,这也是很多人用它的原因。:)
三、使用new和delete,而不是malloc和free
new和delete会分别调用构造和析构,而malloc和free不会:对于非内建类型,malloc不仅不会调用构造函数,而且内存分配时malloc很可能并不会生效。
string *stringarray1 = static_cast<string*>
(malloc(10 * sizeof(string)));//并没有为string的成员变量char *分配空间,也没有进行初始化
string *stringarray2 = new string[10];//OK
不要混用new和malloc以及delete和free