Destructor Trong C++ – Techacademy

Trong bài học kinh nghiệm thời điểm ngày hôm nay tất cả chúng ta liên tục tìm hiểu và khám phá về hàm hủy ( Destructor ) trong C + +. Mục đích của hàm hủy trong C + + là gì ? Cách sử dụng hàm hủy như thế nào ? Chúng ta sẽ cùng khám phá trong nội dung sau đây .

I. Hàm Destructor Trong C + Là Gì

Hàm hủy ( Destructor ) trong C + + ngược lại với hàm thiết kế xây dựng, trong khi hàm kiến thiết xây dựng dùng để khởi tạo giá trị cho đối tượng người tiêu dùng thì hàm hủy dùng để hủy đối tượng người tiêu dùng .
Chỉ có duy nhất một hàm hủy trong 1 lớp. Hàm hủy tự động hóa được gọi. Nếu như tất cả chúng ta không định nghĩa hàm hủy thì mặc định trình biên dịch sẽ tự tạo ra 1 hàm hủy mặc nhiên

Cũng giống như hàm xây dựng, hàm hủy được định nghĩa có cùng tên với tên lớp, khôn có bất cứ kiểu gì trả về kể cẳ kiểu void, tuy nhiên phải có dấu ~ trước tên của hàm hủy.

Lưu ý : Hàm hủy ( Destructor ) không có bất kể tham số nào

Cú pháp

Cú pháp của hàm hủy ( Destructor ) trong C + + như sau :

Cú pháp

~TenLop() { };

Ví dụ đơn cử là lớp nhân viên cấp dưới, thì tất cả chúng ta sẽ tạo hàm hủy cho lớp nhân viên cấp dưới như sau :

Ví dụ

class NhanVien {  
   public:  
        ~NhanVien(){};
};

Ví dụ

Chúng ta cùng xem xét một ví dụ đơn thuần nhất về hàm hủy trong C + + như sau :
Ví dụ

#include   
using namespace std;  
class NhanVien  {  
   public:  
        NhanVien() {    
            cout << "Ham xay dung duoc goi" << endl;    
        }    
        ~NhanVien() {    
            cout << "Ham huy duoc goi" << endl;    
        }  
};  
int main(void) {  
    NhanVien n1;   
    NhanVien n2; 
    return 0;  
}

Hàm Destructor Trong C+Là Gì

II. Khi Nào Hàm Destructor Được Gọi

Hàm hủy ( Destructor ) trong C + + được gọi tự động hóa lúc đối tượng người dùng đi ra khỏi khoanh vùng phạm vi :

  • Kết thúc hàm
  • Kết thúc chương trình
  • Kết thúc 1 block
  • Toán tử delete được gọi

Có hai hạn chế lúc dùng hàm hủy đó là :

  • Chúng ta không thể lấy địa chỉ của nó
  • Lớp con không có thừa kế hàm hủy từ lớp cha của nó

Khi Nào Hàm Destructor Được Gọi

III. So Sánh Hàm Destructor Với Hàm Constructor

+ Giống Nhau :

Hàm tạo và hàm hủy là những hàm thành viên có cùng tên với lớp của chúng. Loại cũ constructor giúp khởi tạo một đối tượng người dùng. Ngược lại, a người tàn phá khác với hàm tạo sẽ xóa hàm tạo đã tạo khi nó không được sử dụng .
Đôi khi nó được yêu cầu khởi tạo 1 số phần của một đối tượng người dùng trước lúc nó hoàn toàn có thể được sử dụng. Ví dụ, tất cả chúng ta đang thao tác trên ngăn xếp, trước khi tất cả chúng ta triển khai bất kể hành vi nào, đỉnh của ngăn xếp phải luôn được đặt bằng 0. Tính năng khởi tạo tự động hóa này được thực thi trải qua ‘ Constructor ’ .
Giống như, trường hợp 1 đối tượng người dùng cần thực thi 1 số mã trước lúc nó bị tàn phá. Ví dụ : nếu một đối tượng người dùng cần đóng một tệp mà nó đã mở, trước khi nó bị tàn phá. Nó hoàn toàn có thể được thực thi với sự trợ giúp của ‘ Destructor ’. Bây giờ, hãy tổng quan về một số ít điểm độc lạ cơ bản giữa hàm tạo và hàm hủy với sự trợ giúp của biểu đồ so sánh

+ Khác Nhau :

– Biểu đồ so sánh:

Cơ sở để so sánh Constructor Kẻ hủy diệt
Mục đích Nó cấp phát bộ nhớ cho 1 đối tượng. Nó phân bổ bộ nhớ của một đối tượng.
Tờ khai class_name (các đối số nếu có) {}; ~ class_name (không có đối số) {};
Tranh luận Hàm tạo chấp nhận đối số Trình hủy không chấp nhận bất kỳ đối số nào.
Kêu gọi Hàm tạo được gọi tự động, trong lúc đối tượng được tạo. Bộ hủy được gọi tự động, lúc khối được thoát hoặc chương trình kết thúc.
Đang làm việc Constructor cho phép một đối tượng khởi tạo một số giá trị của nó trước đó, nó được sử dụng. Destructor cho phép một đối tượng thực thi một số mã tại thời điểm nó bị phá hủy.
Thứ tự thực hiện Hàm tạo được gọi theo thứ tự liên tiếp. Hàm hủy được gọi theo thứ tự ngược lại của hàm tạo.
Bằng số Có thể có nhiều hàm tạo trong một lớp. Luôn có một hàm hủy duy nhất trong lớp.
Copy Constructor Copy constructor cho phép một constructor khai báo và khởi tạo một đối tượng từ một đối tượng khác. Không có khái niệm như vậy.
Quá tải Các trình xây dựng có thể bị quá tải. Bộ hủy không thể bị quá tải.

– Định nghĩa của Constructor

A constructor về cơ bản là 1 hàm thành viên của lớp, nó khởi tạo đối tượng người tiêu dùng và cấp phép bộ nhớ cho nó. Các hàm tạo hoàn toàn có thể được xác lập thuận tiện vì chúng được khai báo và định nghĩa cùng tên với tên của lớp. Một phương pháp khởi tạo không có bất kể kiểu trả về nào ; thế cho nên, chúng không trả lại bất kỳ thứ gì, thậm chí còn không phải là ‘ void ’. Một Constructor luôn được định nghĩa trong phần public của 1 lớp .
Có thể có nhiều hàm tạo trong 1 lớp ; chúng hoàn toàn có thể được phân biệt dựa trên số lượng và loại đối số được truyền vào. Nếu có nhiều hàm tạo trong một lớp ; phương pháp khởi tạo ngầm định ( hàm tạo không làm gì ) phải được định nghĩa cùng với chúng ; nó không làm gì ngoài, cung ứng trình biên dịch .
Các hàm tạo cũng hoàn toàn có thể được định nghĩa với những đối số mặc định. Trong khi đó, họ cũng khởi tạo đối tượng người dùng “ động ”. Các hàm tạo không hề được thừa kế, cũng không hề là ảo, nhưng chúng hoàn toàn có thể bị quá tải. Họ không hề được trình làng đến địa chỉ của họ .

– Các loại cấu tạo

Về cơ bản có ba loại cấu trúc – Cấu trúc mặc định, Tham số và Sao chép .

  • Nhà xây dựng mặc định: Nó là một hàm tạo mà không có đối số nào được đưa ra cho hàm tạo. Hàm tạo mặc định không có tham số, nhưng các giá trị cho hàm tạo mặc định có thể được truyền theo mặc định (động).
  • Trình tạo tham số: Kiểu hàm tạo này nhận các đối số; chúng ta có thể chuyển các giá trị khác nhau cho các thành viên dữ liệu làm đối số.
  • Copy Constructor: Copy constructor khác với các loại constructor khác vì nó chấp nhận địa chỉ của đối tượng khác làm đối số.

– Thực hiện hàm tạo

lớp Const { int a, b ; public : Const ( ) / / hàm tạo không có tham số { a = 0 ; b = 0 ; } Const ( int c, int d ) { / / hàm tạo với tham số a = c ; c = d ; } } ; int main ( ) { Const C1 ; C2 ( 10,20 ) ; / / câu lệnh này gọi hàm tạo }
Khi C1 được tạo, một hàm tạo không có tham số nào được thực thi, vì C1 không truyền bất kể tham số nào. Trong khi, khi C2 được tạo, một hàm tạo có tham số sẽ được thực thi, vì nó đang truyền hai số nguyên cho hàm tạo .

– Định nghĩa của Destructor

A Kẻ tiêu diệt cũng là một hàm thành viên của một lớp, nó sẽ phân chia bộ nhớ được cấp phép cho một đối tượng người tiêu dùng. Nó được định nghĩa cùng tên với tên của một lớp, đứng trước dấu ngã ( ~ ) Biểu tượng. Các hàm hủy luôn được gọi theo thứ tự ngược lại của những hàm tạo .
Luôn có một hàm hủy duy nhất trong một lớp, vì nó không gật đầu bất kể đối số nào. Các đối tượng người dùng địa phương bị hủy hoại ngay sau khi quyền trấn áp của việc thực thi thôi thúc khối ; mặt khác, những đối tượng người dùng toàn cục bị hủy hoại khi hàng loạt chương trình kết thúc .
Một trình hủy được gọi ngầm bởi một trình biên dịch. Nếu những lớp được thừa kế và một lớp được dẫn xuất từ ​ ​ lớp cha và cả lớp con và lớp cha đều có hàm hủy ; sau đó, hàm hủy của lớp dẫn xuất được gọi tiên phong, tiếp theo là hàm hủy của lớp cha .

– Triển khai Trình hủy

lớp Const { int a, b ; public : Const ( int c, int d ) / / hàm tạo có tham số. { a = c ; c = d ; cout “ giá trị của a và b là ” ab ” n ” ; } ~ Const ( ) / / hàm hủy đang được gọi. { cout “ đối tượng người tiêu dùng C1 bị hủy hoại ” ” n ” ; } } ; int main ( ) { Const C1 ( 10,20 ) ; }
Khi đối tượng người dùng C1 được tạo, một hàm tạo có hai tham số kiểu số nguyên được gọi và thành viên “ a, b ” được khởi tạo và giá trị của “ a, b ” được in ra. Sau khi trình hủy đó được gọi và in ra thông tin “ đối tượng người tiêu dùng C1 bị hủy hoại ” .

Need of Destructor

Việc tạo hàm tạo sẽ tiêu tốn một lượng khoảng trống bộ nhớ, vì nó ở đầu cuối sẽ cấp phép bộ nhớ cho những đối tượng người tiêu dùng. Bộ nhớ được cấp phép này phải được phân chia trước khi hủy những đối tượng người tiêu dùng để giải phóng tài nguyên cho những tác vụ khác. Bộ hủy cực kỳ có ích cho mục tiêu đã định, nó hủy hoại hiệu suất cao những đối tượng người tiêu dùng và triển khai những trách nhiệm quét dọn để giải phóng bộ nhớ .
So Sánh Hàm Destructor Với Hàm Constructor

IV. Bài Tập Hàm Destructor Trong C + +

Chúng ta cùng xem một class đơn thuần có sử dụng hàm destructor :

/**
* Techacademy.edu.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: [email protected]
* Fanpage: https://www.facebook.com/cafedevn
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

#include 
#include 
 
class IntArray
{
private:
   int *m_array;
   int m_length;
 
public:
   IntArray(int length) // constructor
   {
      assert(length > 0);
 
      m_array = new int[length]{};
      m_length = length;
   }
 
   ~IntArray() // destructor
   {
      // Dynamically delete the array we allocated earlier
      delete[] m_array;
   }
 
   void setValue(int index, int value) { m_array[index] = value; }
   int getValue(int index) { return m_array[index]; }
 
   int getLength() { return m_length; }
};
 
int main()
{
   IntArray ar(10); // allocate 10 integers
   for (int count{ 0 }; count < ar.getLength(); ++count)
      ar.setValue(count, count+1);
 
   std::cout << "The value of element 5 is: " << ar.getValue(5) << '\n';
 
   return 0;
} // ar is destroyed here, so the ~IntArray() destructor function is called here

Mẹo nhỏ
Nếu bạn thử biên dịch đoạn code trên và bị lỗi sau :

If you compile the above example and get the following error:

error: 'class IntArray' has pointer data members [-Werror=effc++]|
error:   but does not override 'IntArray(const IntArray&)' [-Werror=effc++]|
error:   or 'operator=(const IntArray&)' [-Werror=effc++]|

Để khắc phúc lỗi này, bạn hoàn toàn có thể loại bỏ cờ “ – Weffc + + ” khỏi compile settings ( những thiết lập về biên dịch ) cho ví dụ này, hoặc là bạn hoàn toàn có thể thêm hai dòng code sau vào trong class IntArray :

IntArray(const IntArray&) = delete;
IntArray& operator=(const IntArray&) = delete;

Chúng ta sẽ đàm đạo về tính năng của hai câu lệnh này trong chương sau .
Đoạn chương trình trên sẽ in ra :

The value of element 5 is: 6

Trên dòng tiên phong, tất cả chúng ta đã khởi tạo 1 đối tượng người dùng mới của class IntArray, được gọi là ar, và truyền vào độ dài mảng là 10. Việc khởi tạo này sẽ gọi tới hàm constructor nhằm mục đích cấp phép bộ nhớ động cho những biến thành viên của class IntArray .
Chúng ta bắt buộc sử dụng cấp phát động tại đây do tại tất cả chúng ta không hề biết được tại thời gian biên dịch ( compile time ) thì độ dài của mảng là bao nhiêu ( caller – đối tượng người tiêu dùng gọi hàm sẽ quyết định hành động điều đó ) .
Khi hàm main ( ) kết thúc, lúc này đối tượng người tiêu dùng ar đã nằm ngoài khoanh vùng phạm vi đoạn code mà chương trình đang chạy trên đấy ( tức là ar đã goes out of scope ). Điều này sẽ làm cho hàm destructor ~ IntArray ( ) được gọi, để xóa đi mảng mà tất cả chúng ta đã cấp phép bên trong phần thân hàm của constructor !
Bài Tập Hàm Destructor Trong C++
Đánh Giá Chất Lượng Bài Viết

Average rating 0 / 5. Vote count : 0 No votes so far ! Be the first to rate this post.