Item 1 . 尽量以const 和 inline 取代 #define
原因1: #define 出错编译器找起来困难,用const可以代替。
一、常量
普通常量:
#define ASPECT_RATIO 1.653 // c程序员常用方法
const double ASPECT_RATIO = 1.653; // c++用const替代
指针常量:
const char* const authorName = "Jeremy";
*号在const左边,表示指针指向的目标为常量;
*号在const右边, 表示指针本身为常量.
类成员常量:
static const int NUM_TRUNS = 5; // 类的静态常量
二、函数
原因2:
#define max(a,b) ((a) > (b)) ? (a) : (b)
如果下面这样使用max函数,val1就会累加两次
max( ++val1, val2);
所以使用
inline int max(int a , int b) {return a > b ? a : b ;}
如果要与类型无关,那就要用template了 -__-
template <class T>
inline const T& max(const T& a, const T& b) {return a > b ? a : b ;}
这儿的函数形参与返回值类型为T&,要不然就会传值而不传址了
Item 2. 尽量以<iostream>取代<stdio.h>
原因: 1, scanf和printf不具备型别安全 2 , 不可扩充
重载<<和>>运算符, 可以让cout(cin)输出(输入)用户自定义的对象类型。
重载后用户就可以如果使用如下方法来输出(输入)一个分数了,而scanf(printf)却不能。
int i;
Rational r; // r 是一分数
...
cin >> i >>r;
cout << i << r;
怎么来实现这个功能呢?下面是Rational的代码,特别注意重载<<运算符的代码。
class Rational
{
public:
Rational(int numerator = 0, int denominator = 1);
...
private:
int n, d; // 分子(numerator )和分母(denominator )
friend ostream& operator<<(ostream& s, const Rational& r );
}
因为<<是二元运算符,又要用户习惯用cout << ,所以不做为类的成员来重载,而是通过友元来重载
如果做为类的成员来重载,则得调用 r <<cout 来输出了,用起来别扭
ostream& operator << (ostream& s , const Rational& r)
{
s << r.n << '/' << r.d;
return s;
}
boost库里面有Rational的实现,要仔细看看 -__-
Item 3. 尽量以new和delete取代malloc和free
Item 4. 尽量使用C++风格的注释形式
Item 5. 使用相同形式的new 和delete
调用new时用了[],必须在调用delete时用[],反之不使用
string *pStr1 = new string;
string *pStr2 = new string[100];
delete pStr1;
delete [] pStr2;
特殊情况:
typedef string AddressLines[4];
string *pal = new AddressLines; // 和new string[4]等价
所以用delete [] pal;
最好尽量不要对数组类型做typedef动作(好像在哪看过,推荐用typedef定义数组来着... -__- lzc也这样说)
据我观察如果用typedef定义一个数组,那命名最好用arrayInt10,arrayDouble12之之类比较好 :D