类设计者的核查表(转自C++rumination)
1。你的類(lèi)需要一個(gè)構(gòu)造函數(shù)么?
2。你的數(shù)據(jù)成員是私有的么?
感覺(jué)對(duì)于簡(jiǎn)單的只是用于數(shù)據(jù)包裝的類(lèi)不需要把數(shù)據(jù)成員設(shè)成私有,比如一個(gè)復(fù)數(shù)類(lèi)。對(duì)于復(fù)雜類(lèi)的狀態(tài)應(yīng)該設(shè)成私有,只允許通過(guò)接口函數(shù)來(lái)更改和讀取成員。
?
3。你的類(lèi)需要一個(gè)無(wú)參的構(gòu)造函數(shù)么?
需要,(1).若無(wú)無(wú)參構(gòu)造函數(shù),則類(lèi)似于Point p;的語(yǔ)法是非法的。(2)更重要的是無(wú)法生成該類(lèi)對(duì)象的數(shù)組, Point pa[100]; //錯(cuò)誤!!
?
4。是不是每個(gè)構(gòu)造函數(shù)初始化所有的數(shù)據(jù)成員?
為了不導(dǎo)致未初始化錯(cuò)誤,盡量初始化所有成員,但有些情況例外,比如只有對(duì)象存在一段時(shí)間之后其成員才有意義。
?
5。類(lèi)需要析構(gòu)函數(shù)么?
取決于該類(lèi)是否分配了資源,而這些資源又不會(huì)被成員函數(shù)自動(dòng)釋放。
?
6。類(lèi)需要一個(gè)虛析構(gòu)函數(shù)么?
虛析構(gòu)函數(shù)是很有必要的的,當(dāng)新類(lèi)繼承此類(lèi)之后,假如基類(lèi)沒(méi)有虛析構(gòu)函數(shù),當(dāng)基類(lèi)指針指向派生類(lèi),析構(gòu)時(shí)可能導(dǎo)致調(diào)用錯(cuò)誤的析構(gòu)函數(shù)。
?
7。你的類(lèi)需要復(fù)制構(gòu)造函數(shù)么?
同樣,取決于當(dāng)類(lèi)的構(gòu)造函數(shù)分配資源,比如成員函數(shù)里有int *變量。。。
?
8。你的類(lèi)需要一個(gè)賦值操作符么?
同7,一般需要復(fù)制構(gòu)造函數(shù)就需要一個(gè)賦值操作符
?
9。你的賦值操作符能正確的將對(duì)象賦給對(duì)象本身么?
?
class String { public:String& operator=(const String& s);//... private:char* data; }; //錯(cuò)誤實(shí)現(xiàn),無(wú)法把對(duì)象賦給對(duì)象本身 String& String::operator =(const String &s) {delete[] data;data=new char[strlen(s.data)+1];strcpy(data,s.data);return *this; } //正確實(shí)現(xiàn) String& String::operator =(const String &s) {if(&s!=this){delete[] data;data=new char[strlen(s.data)+1];strcpy(data,s.data);}return *this; }?
?
10。 你的類(lèi)需要定義關(guān)系操作符么?
depends
?
11。 操作數(shù)組記住delete[]么?
?
12。記得在復(fù)制構(gòu)造函數(shù)和賦值操作符的參數(shù)類(lèi)型中加上const了么?
?
13。如果函數(shù)有引用參數(shù),他們是const引用么?
總結(jié)
以上是生活随笔為你收集整理的类设计者的核查表(转自C++rumination)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 更改Gradle镜像下载地址
- 下一篇: 全面剖析ESP32创建Wi-Fi热点的过