Computer >> Máy Tính >  >> Lập trình >> C ++

Quy tắc ba trong C ++.

Quy tắc ba là một trong những quy tắc của C ++ theo quy tắc ngón tay cái để xây dựng một mã an toàn ngoại lệ. Các quy tắc này quy định cách các thành viên mặc định của lớp nên được sử dụng cho thực hành miễn phí ngoại lệ.

Quy tắc ba còn được gọi là Quy tắc ba lớn hoặc Ba lớn và quy định cho classthat, nếu một lớp xác định bất kỳ phần nào trong ba phần được đề cập thì nó có thể phải xác định rõ ràng cả ba -

  • trình hủy
  • sao chép hàm tạo
  • sao chép hàm tạo phép gán

Ba hàm này là các hàm thành viên đặc biệt của lớp. Nếu không có cái nào trong số chúng được định nghĩa rõ ràng bởi người lập trình, thì trình biên dịch sẽ cung cấp các phiên bản ngầm định. Nếu bất kỳ điều nào ở trên được xác định rõ ràng, điều đó có nghĩa là các phiên bản ngầm định cho hai điều còn lại phải không phù hợp và phải được xác định lại.

Điều này xảy ra bởi vì các hàm tạo được tạo ngầm định và toán tử gán 'quét cạn các thành viên dữ liệu. Chúng tôi yêu cầu bản sao sâu khi lớp chứa con trỏ trỏ đến tài nguyên được cấp phát động.

Các hàm hủy mặc định loại bỏ các đối tượng không sử dụng. Khi không có hàm tạo bản sao nào được xác định thì hàm hủy sẽ chạy hai lần, một lần cho các đối tượng chứa bản sao và lần hai cho các đối tượng mà từ đó các thành viên dữ liệu được sao chép. Để tránh điều này, cần định nghĩa rõ ràng.

Hãy để chúng tôi hiểu với một ví dụ trong đó không có hàm tạo bản sao và không có toán tử gán bản sao, nhưng trình hủy có mặt -

Ví dụ

#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;
}

Đầu ra

*** Error in `./a.out': double free or corruption (fasttop): 0x0000000001f46c20 ***
Aborted
  • Điều này xảy ra vì hàm hủy được gọi hai lần khi chương trình vượt ra khỏi phạm vi. Lần đầu tiên xóa Num1 và sau đó cho Num2. Hàm tạo sao chép mặc định tạo ra bản sao của con trỏ ptr nhưng không được cấp phát bộ nhớ cho nó. Vì vậy, khi Num1 bị loại bỏ ptrs tiếp theo sẽ khiến chương trình bị sập.