C 大三法則相關問題

2021-06-10 06:12:48 字數 1355 閱讀 2384

最近,曾老師再講c++,講到c++大三法則,不同特來搜尋,總結如下:

c++三法則:如果需要析構函式,則一定需要拷貝建構函式和賦值操作符。

如何理解這句話,首先,從「如果需要析構函式」這裡我們知道,類中必然出現了指標型別的成員(否則不需要我們寫析構函式,預設的析構函式就可以用了),所以,我們需要自己寫析構函式來釋放給指標所分配的記憶體來防止記憶體洩露,那麼為什麼說「一定需要拷貝建構函式和賦值操作符」呢,原因還是這樣:類中出現了指標型別的成員。有指標型別的成員,我們必須防止淺拷貝問題,所以,一定需要拷貝建構函式和賦值操作符,這兩個函式是防止淺拷貝問題所必須的。  ----- piaopiaohu123

這裡涉及到了淺拷貝,下面說明一下淺拷貝:

class test

test(){}                    //無引數建構函式

private: 

int data;

};int main()

這一句b = a;就是淺拷貝,執行完這句後b.data = 5;

如果物件中沒有其他的資源(如:堆,檔案,系統資源等),則深拷貝和淺拷貝沒有什麼區別,但當物件中有這些資源時,

例子:class a // 假如其中有一段動態分配的記憶體 a(){}; ~a() // 析構時釋放資源

private:

int* data;

int size;

};int main()

這裡的b = a會造成未定義行為,因為類a中的複製建構函式是編譯器生成的,所以b = a執行的是乙個淺拷貝過程。我說過淺拷貝是物件資料之間的簡單賦值,比如:

b.size = a.size; b.data = a.data; // oops!

這裡b的指標data和a的指標指向了堆上的同一塊記憶體,a和b析構時,b先把其data指向的動態分配的記憶體釋放了一次,而後a析構時又將這塊已經被釋放過的記憶體再釋放一次。

對同一塊動態記憶體執行2次以上釋放的結果是未定義的,所以這將導致記憶體洩露或程式崩潰。

所以這裡就需要深拷貝來解決這個問題,深拷貝指的就是當拷貝物件中有對其他資源(如堆、檔案、系統等)的引用時(引用可以是指標或引用)時,物件的另開闢一塊新的資源,而不再對拷貝物件中有對其他資源的引用的指標或引用進行單純的賦值。如:

class a // 假如其中有一段動態分配的記憶體 a(){}; a(const a& _a) : size(_a.size) // 深拷貝 ~a() // 析構時釋放資源

private: int* data; int size; }

int main()

總結:深拷貝和淺拷貝的區別是在物件狀態中包含其它物件的引用的時候,當拷貝乙個物件時,如果需要拷貝這個物件引用的物件,則是深拷貝,否則是淺拷貝。-----xdx2ct1314

C 設計三法則 二法則

三法則 英語 rule of three,the law of the big three,the big three 三法則,三大定律 在 c 程式設計裡,它是乙個以設計的基本原則而制定的定律,三法則的要求在於,假如類有明顯地定義下列其中乙個成員函式,那麼程式設計師必須連其他二個成員函式也一同編寫...

C 類的「三法則」

三法則 定義其中乙個成員函式,那麼程式設計師必須連其他二個成員函式也一同編寫至類內,亦即下列三個成員函式缺一不可。析構函式 destructor 複製建構函式 copy constructor 複製賦值運算子 copy assignment operator 理解點 用到自己寫析構的話一般得釋放自己...

網路服務規模三法則

前幾天看了hust的 的ppt,其中講到了網路服務的規模問題。網路服務的規模分為三種 sarnoff law 效益規模是o n,網路是廣播媒介,任1傳送者 裝置 和多個 n 1 接收者 裝置 這種法則的拓普結構是星形的,大概相當於我們常說的c s模式吧。metcalfe law 效益規模是o n2 ...