第二部分 構造 析構與賦值運算 條款5 12

2021-06-07 14:33:57 字數 1710 閱讀 8431

這裡是第二部分

條款 5:c++默默編寫並呼叫哪些函式

如果你沒有寫建構函式、析構函式、copy建構函式和賦值操作符,c++會自己為你編寫預設的函式。如果你自己編寫了,c++不再合成

如果你打算在乙個內含 reference成員的class內支援賦值操作,你必須自己定義賦值操作符,面對const成員,編譯器的反應也是一樣的。如果某個基類的copy 操作符是乙個private,那麼編譯器拒絕為其派生類生成乙個。

條款 6:若不想使用編譯器自動生成的函式,就應該明確拒絕

常用的方法是將copy函式(copy建構函式和copy賦值操作符)宣告為private而不去定義,但是這麼做類的友元函式還是可以訪問。友元函式的訪問會導致連線期間的錯誤,我們應該把連線期間的錯誤提到編譯期間:

class a ;

class b : private a ;

條款 7:virtual析構函式

這裡主要是說具有多型性質的基類的析構函式應該宣告為virtual,不然的話析構的時候如果是析構乙個基類指標那麼派生類部分就無法析構了。但是不是所有的類的析構函式都應該宣告為virtual,因為如果沒有多型性質那麼程式會無緣無故的占用乙個指標vtbl即虛函式表指標,造成資源的浪費。

那麼換句話說,不帶virtual的基類一般不能夠被繼承

條款 8 :不要讓異常逃離析構函式

一般來說析構函式不要丟擲異常。如果丟擲異常,我們應該捕捉異常,吞下它或者結束程式:

db::~db()

catch(....) }

如果客戶需要對某個執行期間的異常做出反應,那麼class應該提供乙個普通函式執行該操作:

class db

~db()

catch(....) }

}private:

dbconnection db;

bool closed; };

條款 9: 不要在析構函式和建構函式中呼叫virtual函式

建構函式的構造順序是先基類後派生類,在基類構造的時候virtual函式不是virtual函式,因為此時派生類還沒有構造出來。析構函式的析構與構造的次序相反,所以不能夠出現多型行為。一種可行的方法:

class a ;

a::a()

class b : public a

....

private:

static std::string createlogstring(param); };

條款10 : operator=返回乙個*this

條款11: operator=中處理自我複製

例子;

a& a::operator=(const a& rhs)

這樣做是可以的,但是不具有安全性

a& a::operator=(const a& rhs)

一種替代的方法:

class a ;

a& a::operator=(const a& rhs)

條款12: 複製物件不要忘記每乙個成分的複製

派生類的複製的時候不要忘記對基類的複製

不要以某個copy函式實現另外乙個copy函式。應該將共同的機能放進第三個函式中,由兩個copy函式共同呼叫

Web API 第二部分

web api 第二部分 元素偏移量 offset element.offsettop element.offsetleft element.offsetwidth 可以得到元素的大小 寬度和高度 是包含padding border width element.offsetheight elemen...

redux 第二部分

redux 的使用方法,為什麼使用 action.js 檔案,進行優化 將其分開,然後我們通過工廠函式的每次返回不同的物件,由於引數是固定的,每次返回的都是事件型別和事件資料,所以我們可以使用乙個函式,通過其返回值來返回乙個物件,讓後傳遞給 action 我們的 reducer 函式有兩個引數,引數...

實驗二 第二部分

第二部分 ftp協議分析 1.兩個同學一組,a和b。2.在a主機上架設ftp伺服器 3.在b主機上執行wireshark,並登陸a主機的ftp伺服器,上傳一張,得到抓取的資料報,4.進行追蹤tcp流,顯示為原始資料,分析得到a主機登陸ftp的過程及使用者名稱密碼,還原上傳的,第二部分 ftp協議分析...