條款1:盡量用const和inline而不用#define
注意情況:定義指針常量時(shí),因?yàn)槌A慷x一般是放在頭文件中,除了指針?biāo)傅念?lèi)型要定 義成const外,重要的是指針也經(jīng)常要定義成const。
const char * const authorName = "Scott Meyers";
另外,定義某個(gè)類(lèi)(class)的常量時(shí),
為了保證常量最多只有一份拷貝,還要把它定義為靜態(tài)成員。
條款3:盡量用new和delete而不用malloc和free
malloc和free不知道構(gòu)造函數(shù)和析構(gòu)函數(shù)。在free數(shù)組時(shí)沒(méi)有調(diào)用析構(gòu)函數(shù)的功能。
條款11: 為需要?jiǎng)討B(tài)分配內(nèi)存的類(lèi)聲明一個(gè)拷貝構(gòu)造函數(shù)和一個(gè)賦值操作符
看下面一個(gè)表示string對(duì)象的類(lèi):
// 一個(gè)很簡(jiǎn)單的string類(lèi)
class string {
public:
string(const char *value);
~string();
... // 沒(méi)有拷貝構(gòu)造函數(shù)和operator=
private:
char *data;
};
如果這樣定義兩個(gè)對(duì)象:
string a("hello");
string b("world");
b = a;
這種情況下至少有兩個(gè)問(wèn)題。第一,b曾指向的內(nèi)存永遠(yuǎn)不會(huì)被刪除,因而會(huì)永遠(yuǎn)丟失。這是產(chǎn)生內(nèi)存泄漏的典型例子。第二,現(xiàn)在a和b包含的指針指向同一個(gè)字符串,那么只要其中一個(gè)離開(kāi)了它的生存空間,其析構(gòu)函數(shù)就會(huì)刪除掉另一個(gè)指針還指向的那塊內(nèi)存。