C++ 三法則


三法則是在C++中構建異常安全程式碼的經驗法則之一。這些規則規定了類的預設成員應該如何用於免異常實踐。

三法則也稱為“三大法則”或“大三法則”,它規定,如果一個類定義了以下三個成員中的任何一個,那麼它就應該顯式地定義所有三個:

  • 解構函式
  • 複製建構函式
  • 複製賦值運算子

這三個是類的特殊成員函式。如果程式設計師沒有顯式定義它們中的任何一個,編譯器將提供隱式版本。如果顯式定義了任何一個,則意味著其他兩個的隱式版本可能不正確,必須重新定義。

發生這種情況是因為隱式生成的建構函式和賦值運算子對資料成員進行淺複製。當類包含指向動態分配資源的指標時,我們需要深複製。

預設解構函式刪除未使用的物件。如果沒有定義複製建構函式,則解構函式將執行兩次,一次用於包含副本的物件,另一次用於從中複製資料成員的物件。為避免這種情況,需要顯式定義。

讓我們透過一個例子來理解,在這個例子中,沒有複製建構函式和複製賦值運算子,但存在解構函式:

示例

 線上演示

#include <stdio.h>
class Numbers{
private:
   int num;
   int* ptr;
   public:
   Numbers( int n, int* p ) //copy constructor{
      num =n ;
      ptr = new int[ num ];
   }
   ~Numbers() //destructor{
      delete ptr;
      ptr = NULL;
   }
};
int main(){
   int arr[ 4 ] = { 11, 22, 33, 44 };
   Numbers Num1( 4, arr );
   // this creates problem
   Numbers Num2( Num1 );
   return 0;
}

輸出

*** Error in `./a.out': double free or corruption (fasttop): 0x0000000001f46c20 ***
Aborted
  • 發生這種情況是因為當程式超出範圍時,解構函式被呼叫了兩次。首先刪除 Num1,然後刪除 Num2。預設複製建構函式建立指標 ptr 的副本,但沒有為其分配記憶體。因此,當 Num1 被移除後,後續的 ptr 將導致程式崩潰。

更新於:2020-7-28

665 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.