當定義乙個類時,我們顯式或隱式地定義了此型別的物件在拷貝、賦值和銷毀時做什麼?
乙個類通過定義三種特殊成員成員函式來控制這些操作:拷貝建構函式、拷貝賦值函式、析構函式。
什麼是三法則
c++三法則:如果需要析構函式,則一定需要拷貝建構函式和拷貝賦值操作符。
如何理解這句話,通常,若乙個類需要析構函式,則代表其合成的析構函式不足以釋放類所擁有的資源,其中最典型的就是指標成員。
所以,我們需要自己寫析構函式來釋放給指標所分配的記憶體來防止記憶體洩露。
那麼為什麼說「一定需要拷貝建構函式和賦值操作符」呢?
原因還是這樣:類**現了指標型別的成員。有指標型別的成員,我們必須防止淺拷貝問題,所以,一定需要拷貝建構函式和賦值操作符,這兩個函式是防止淺拷貝問題所必須的。
class
rule_of_three
public
:rule_of_three
(const
char
* s ="")
~rule_of_three()
rule_of_three
(const rule_of_three& other)
// 複製建構函式
rule_of_three&
operator=(
const rule_of_three& other)
// 複製賦值
return
*this;}
};
通過可複製控制代碼來管理不可複製資源的類,可能必須將其複製賦值和複製建構函式宣告為私有的並且不提供其定義,或將它們定義為棄置的。這是三之法則的另一種應用:刪除其中之一而遺留其他被隱式定義很可能會導致錯誤。
什麼是五法則
在較新的 c++11 標準中,為了支援移動語義,又增加了移動建構函式和移動賦值運算子,這樣共有五個特殊的成員函式,所以又稱為「c++五法則」;
也就是說,「三法則」是針對較舊的 c++89 標準說的,「五法則」是針對較新的 c++11 標準說的;為了統一稱呼,後來人們幹把它叫做「c++ 三/五法則」;
class
rule_of_five}~
rule_of_five()
//析構函式
rule_of_five
(const rule_of_five& other)
// 複製建構函式
:rule_of_five
(other.cstring)
rule_of_five
(rule_of_five&& other)
noexcept
// 移動建構函式
:cstring
(std::
exchange
(other.cstring,
nullptr))
rule_of_five&
operator=(
const rule_of_five& other)
// 複製賦值
rule_of_five&
operator
=(rule_of_five&& other)
noexcept
// 移動賦值
// 另一種方法是用以下函式替代兩個賦值運算子
// rule_of_five& operator=(rule_of_five other) noexcept
//
};
與三之法則不同的是,不提供移動建構函式和移動賦值運算子通常不是錯誤,但會導致失去優化機會。 三五之夜的意思,三五之夜指的是什麼?
古漢語中,如果有並舉兩數,那麼就以其乘積表現。如 三五之夜,明月半牆。項脊軒志 三五 之積為十五,三五之夜 指陰曆每月十五的月圓之夜。三五之夜的意思 三五之夜指陰曆每月十五的月圓之夜。出自 項脊軒志 項脊軒志 原文 節選 前闢四窗,垣牆周庭,以當南日,日影反照,室始洞然。又雜植蘭桂竹木于庭,舊時欄楯...
C 設計三法則 二法則
三法則 英語 rule of three,the law of the big three,the big three 三法則,三大定律 在 c 程式設計裡,它是乙個以設計的基本原則而制定的定律,三法則的要求在於,假如類有明顯地定義下列其中乙個成員函式,那麼程式設計師必須連其他二個成員函式也一同編寫...
三五杆槍,可幹革命,三五個人,可以創業
中國從來不缺有想法的人,缺的是把想法付諸於實踐並最終實現的人。而一般的人們傳統,保守,瞻前顧後,猶豫不決,從不敢冒險冒進 喜歡躲在乙個角落造乙個籠子把自己給圈起來,而後仰視籠子外站在遙遠地方的人,直呼 那是個神人 所以即便大多數有想法的人最終也沒了想法,於是乎終究都被同化,最後卻還乙個勁的問,為什麼...