Kẻ hủy diệt C++

Constructor và Destructor là các hàm thành viên đặc biệt của lớp được tạo bởi trình biên dịch C++ hoặc có thể được định nghĩa bởi người dùng. Hàm khởi tạo được sử dụng để khởi tạo đối tượng của lớp trong khi hàm hủy được gọi bởi trình biên dịch khi đối tượng bị hủy

Constructor trong C++ là gì?

Hàm tạo là một hàm thành viên đặc biệt của một lớp và có cùng tên với tên của lớp, có nghĩa là hàm tạo và lớp có cùng tên. Constructor được gọi bởi trình biên dịch bất cứ khi nào đối tượng của lớp được tạo, nó cấp phát bộ nhớ cho đối tượng và khởi tạo các thành viên dữ liệu của lớp theo giá trị mặc định hoặc giá trị do người dùng truyền vào khi tạo đối tượng. Các hàm tạo không có bất kỳ kiểu trả về nào vì công việc của chúng chỉ là tạo và khởi tạo một đối tượng

Cú pháp cơ bản của Constructor trong C++ là gì?

Cú pháp cơ bản của hàm tạo được đưa ra dưới đây

class class_name{
  private: 
  // private members 
  
  public: 
  
  // declaring constructor
  class_name({parameters})
  {
    // constructor body 
  }
  
};

Theo cú pháp trên, chúng ta có thể thấy lớp có tên_tên_lớp và hàm tạo cũng có cùng tên. Một hàm tạo có thể có bất kỳ số lượng tham số nào theo yêu cầu. Ngoài ra, không có kiểu trả về hoặc giá trị trả về của hàm tạo.
Lưu ý. Trong cú pháp trên, chúng ta đã khai báo hàm tạo là thành viên public nhưng chúng ta cũng có thể khai báo nó là private (chúng ta sẽ thảo luận điều đó sau trong bài viết này).

Những điểm quan trọng về Constructor

truy cập specifiers

Constructor có thể được xác định là công khai, được bảo vệ hoặc riêng tư theo yêu cầu. Theo mặc định hoặc các hàm tạo mặc định, được tạo bởi trình biên dịch và được khai báo là công khai. Nếu hàm tạo được tạo ở chế độ riêng tư, thì chúng ta không thể tạo đối tượng của nó.
Khi không có yêu cầu về đối tượng của một lớp (trong trường hợp tất cả các thành viên của lớp là tĩnh), chúng ta có thể định nghĩa hàm tạo của nó là private.
Thông thường, hàm tạo được định nghĩa là công khai vì hàm tạo được sử dụng để tạo đối tượng và khởi tạo thành viên dữ liệu lớp cho đối tượng. Một đối tượng luôn được tạo từ bên ngoài lớp, điều này biện minh cho việc đặt các hàm tạo ở chế độ công khai.

di sản

Vì một lớp dẫn xuất có thể truy cập tất cả các thuộc tính công khai của lớp cơ sở, nó cũng có thể gọi hàm tạo của nó nếu nó không được khai báo là riêng tư. Ngoài ra, địa chỉ của người xây dựng không thể được tham chiếu

Ảo

Constructor trong C++ không thể khai báo là ảo vì khi chúng ta khai báo bất kỳ hàm nào của một lớp là hàm ảo thì lúc biên dịch trình biên dịch sẽ tạo một bảng ảo để lưu địa chỉ của từng hàm được khai báo là ảo. Ngoài ra, nó tạo một thành viên dữ liệu của con trỏ ảo của lớp để trỏ tới bảng ảo. Nhưng như chúng ta đã thảo luận, chúng ta không thể tham chiếu đến địa chỉ của hàm tạo, điều đó có nghĩa là chúng ta không thể khai báo hàm tạo là ảo

Có bao nhiêu loại Constructor trong C++?

Có bốn loại hàm tạo trong C++

  • Nhà xây dựng mặc định
  • hàm tạo được tham số hóa
  • Trình tạo bản sao
  • Trình tạo động

Hãy thảo luận chi tiết về chúng

Trình tạo mặc định

Hàm tạo mặc định còn được gọi là hàm tạo đối số không, vì nó không nhận bất kỳ tham số nào. Nó có thể được xác định bởi người dùng nếu không thì trình biên dịch sẽ tự tạo ra nó. Hàm tạo mặc định luôn khởi tạo các thành viên dữ liệu của lớp có cùng giá trị mà chúng được xác định

cú pháp

class class_name{
  private: 
  // private members 
  
  public: 
  
  // declaring default constructor
  class_name()
  {
    // constructor body 
  }
  
};

Mã để hiển thị hoạt động của hàm tạo mặc định

#include 
using namespace std;

class Person{
  
  // declaring private class data members 
private:
  string name;
  int age;
  
public: 

  // declaring constructor
  Person()
  {
      cout<<"Default constructor is called"<<endl;
      name = "student";
      age = 12;
  }
  
  // display function to print the class data members value 
  void display()
  {
      cout<<"Name of current object: "<endl;
      cout<<"Age of current object: "<endl;
  }
  
};
int main() 
{
    // creating object of class using default constructor
    Person obj;
    
    // printing class data members 
    obj.display();
    
    return 0;
}

đầu ra

Default constructor is called
Name of current object: student
Age of current object: 12

Trong đoạn mã trên, chúng tôi đã tạo một lớp có hai thành viên dữ liệu. Khai báo một hàm tạo mặc định luôn khởi tạo các đối tượng của một lớp có cùng tên và tuổi. Trong chức năng chính, chúng tôi đã tạo một đối tượng của lớp và in các giá trị thành viên dữ liệu của nó bằng cách sử dụng chức năng hiển thị

Trình xây dựng được tham số hóa

Hàm tạo được tham số hóa được sử dụng để khởi tạo các thành viên dữ liệu với các giá trị do người dùng cung cấp. Hàm tạo này về cơ bản là phiên bản nâng cấp của hàm tạo mặc định. Chúng ta có thể định nghĩa nhiều hơn một hàm tạo được tham số hóa theo nhu cầu của người dùng, nhưng chúng ta phải tuân theo các quy tắc nạp chồng hàm, chẳng hạn như phải có một bộ đối số khác nhau cho mỗi hàm tạo

cú pháp

class class_name{
  private: 
  // private members 
  
  public: 
  
  // declaring parameterized constructor
  class_name(parameter1, parameter2,...)
  {
    // constructor body 
  }
  
};

Mã để hiểu hoạt động của hàm tạo được tham số hóa

#include 
using namespace std;

class Person{
  
  // declaring private class data members 
private:
  string name;
  int age;
  
public: 

  // declaring parameterized constructor of three different types 
  Person(string person_name)
  {
      cout<<"Constructor to set name is called"<<endl;
      name = person_name;
      age = 12;
  }
  
  Person(int person_age)
  {
      cout<<"Constructor to set age is called"<<endl;
      name = "Student";
      age = person_age;
  }
  
  Person(string person_name, int person_age)
  {
      cout<<"Constructor for both name and age is called"<<endl;
      name = person_name;
      age = person_age;
  }
  // display function to print the class data members value 
  void display()
  {
      cout<<"Name of current object: "<endl;
      cout<<"Age of current object: "<endl;
      cout<<endl;
  }
  
};
int main() 
{
    // creating objects of class using parameterized constructor
    Person obj1("First person");
    
    // printing class data members for first object 
    obj1.display();
    
    Person obj2(25);
    
    // printing class data members for second object 
    obj2.display();
    
    Person obj3("Second person",15);
    
    // printing class data members for third object 
    obj3.display();
    return 0;
}

đầu ra

Constructor to set name is called
Name of current object: First person
Age of current object: 12

Constructor to set age is called
Name of current object: Student
Age of current object: 25

Constructor for both name and age is called
Name of current object: Second person
Age of current object: 15

Trong đoạn mã trên, chúng tôi đã tạo ba loại hàm tạo tham số, một loại chỉ khởi tạo tên, thứ hai chỉ khởi tạo tuổi và thứ ba để khởi tạo cả tên và tuổi. Trong chức năng chính, chúng tôi đã tạo ba loại đối tượng khác nhau và khởi tạo chúng theo những cách khác nhau và in các giá trị cho từng loại.

Trình tạo bản sao

Nếu chúng ta có một đối tượng của một lớp và chúng ta muốn tạo bản sao của nó trong một đối tượng mới được khai báo của cùng một lớp, thì một hàm tạo bản sao được sử dụng. Trình biên dịch cung cấp cho mỗi lớp một hàm tạo bản sao mặc định và người dùng cũng có thể định nghĩa nó. Nó nhận một đối số duy nhất là một đối tượng của cùng một lớp

cú pháp

class class_name{
  private: 
  // private members 
  
  public: 
  
  // declaring copy constructor
  class_name(const class_name& obj)
  {
    // constructor body 
  }
  
};

Trong cú pháp trên, chúng ta đã tạo một hàm tạo sao chép lấy một đối tượng cùng lớp làm tham số nhưng nó được khai báo là hằng số và được truyền dưới dạng tham chiếu bởi vì khi một đối số được truyền dưới dạng tham số hàm, nó sẽ tạo một bản sao cho nó, để tạo trình biên dịch sao chép đó sẽ gọi lại hàm tạo bản sao, có nghĩa là nó sẽ gọi cùng một chức năng và đối với cuộc gọi đó một lần nữa, sẽ có một lệnh gọi để tạo bản sao sẽ thực hiện quá trình này trong quá trình tạo bản sao không bao giờ kết thúc. Để ngăn chặn các điều kiện như vậy, chúng tôi chuyển nó làm tài liệu tham khảo

Mã để hiểu hoạt động của hàm tạo bản sao

________số 8

đầu ra

Constructor for both name and age is called
Name of current object: First person
Age of current object: 25

Copy constructor is called
Name of current object: First person
Age of current object: 25

Trong đoạn mã trên, chúng ta đã tạo một lớp và định nghĩa hai loại hàm tạo trong đó, loại thứ nhất là hàm tạo được tham số hóa và loại khác là hàm tạo sao chép. Hàm tạo được tham số hóa được sử dụng để tạo một đối tượng, sau đó bằng cách sử dụng hàm tạo bản sao, chúng tôi tạo một bản sao của nó và lưu trữ nó trong một đối tượng khác

Trình tạo động

Khi bộ nhớ được phân bổ động cho các thành viên dữ liệu trong thời gian chạy bằng toán tử mới, hàm tạo được gọi là hàm tạo động. Hàm tạo này tương tự như hàm tạo mặc định hoặc được tham số hóa;

cú pháp

class class_name{
  private: 
  // private members 
  
  public: 
  
  // declaring default constructor
  class_name()
  {
    // constructor body 
  }
  
};
0

Mã để hiểu hoạt động của hàm tạo động

________mười một

đầu ra

class class_name{
  private: 
  // private members 
  
  public: 
  
  // declaring default constructor
  class_name()
  {
    // constructor body 
  }
  
};
2

Trong đoạn mã trên, chúng ta đã tạo một lớp với hàm tạo động. Trong chức năng chính, chúng tôi đã tạo một đối tượng và khởi tạo nó bằng cách sử dụng hàm tạo động, trong đó chúng tôi đã cung cấp bộ nhớ động bằng cách sử dụng toán tử mới

Trình hủy trong C ++ là gì?

Destructor chỉ là chức năng ngược lại của constructor. Một hàm hủy được trình biên dịch gọi khi đối tượng bị hủy và chức năng chính của nó là giải phóng bộ nhớ của đối tượng. Đối tượng có thể bị hủy khi chương trình kết thúc hoặc các đối tượng cục bộ của hàm nằm ngoài phạm vi khi hàm kết thúc hoặc trong bất kỳ trường hợp nào khác.
Hàm hủy giống như của lớp với toán tử dấu ngã (~) tiền tố và nó không thể bị quá tải như hàm tạo. Hàm hủy không nhận đối số và không có kiểu trả về và giá trị trả về.

Cú pháp cơ bản của Destructor là gì?

Cú pháp cơ bản của Destructor được đưa ra dưới đây

class class_name{
  private: 
  // private members 
  
  public: 
  
  // declaring default constructor
  class_name()
  {
    // constructor body 
  }
  
};
3

Theo cú pháp trên ta có thể thấy lớp có tên_tên_lớp và hàm hủy cũng có cùng tên, ngoài ra còn có dấu ngã(~). Ngoài ra, không có kiểu trả về và giá trị trả về của hàm hủy.
Lưu ý. Trong cú pháp trên, chúng tôi đã khai báo hàm hủy là thành viên công khai nhưng chúng tôi cũng có thể khai báo nó là riêng tư.

Những điểm quan trọng về Kẻ hủy diệt

  • Hàm hủy là hàm thành viên cuối cùng được gọi cho một đối tượng và chúng được gọi bởi chính trình biên dịch
  • Nếu hàm hủy không được tạo bởi người dùng thì trình biên dịch sẽ tự tạo hoặc khai báo nó
  • Một Destructor có thể được khai báo trong bất kỳ phần nào của lớp, vì nó được gọi bởi trình biên dịch nên không có gì phải lo lắng.
  • Vì Destructor là hàm cuối cùng được gọi, tốt hơn hết là khai báo nó ở cuối lớp để tăng khả năng đọc mã
  • Trình hủy hoàn toàn ngược lại với hàm tạo vì hàm tạo được gọi tại thời điểm tạo đối tượng và cấp phát bộ nhớ cho đối tượng, mặt khác, hàm hủy được gọi tại thời điểm hủy đối tượng và giải phóng bộ nhớ kỉ niệm

Cách Constructor và Kẻ hủy diệt được gọi khi đối tượng được Tạo và Hủy

Vì hàm tạo là hàm đầu tiên được trình biên dịch gọi khi một đối tượng được tạo và hàm hủy là thành viên lớp cuối cùng được trình biên dịch gọi cho một đối tượng. Nếu hàm tạo và hàm hủy không được người dùng khai báo, trình biên dịch sẽ xác định hàm tạo và hàm hủy mặc định của một đối tượng lớp.
Hãy xem một đoạn mã để có ý tưởng chính xác về cách hàm tạo và hàm hủy được gọi.
Đầu tiên, chúng ta sẽ tạo một lớp với các hàm tạo được tham số hóa duy nhất và một hàm hủy. Cả hai đều chứa các câu lệnh in để đưa ra ý tưởng khi chúng được gọi.

class class_name{
  private: 
  // private members 
  
  public: 
  
  // declaring default constructor
  class_name()
  {
    // constructor body 
  }
  
};
4

đầu ra

________mười lăm

Trong đoạn mã trên, chúng ta đã tạo một lớp có hàm tạo và hàm hủy. Trong hàm chính, một đối tượng sử dụng hàm tạo tham số và khi chương trình kết thúc, hàm hủy sẽ được trình biên dịch tự động gọi và chúng ta nhận được các giá trị của các biến của mình

Phần kết luận

  • Constructor và Destructor là các hàm thành viên đặc biệt của lớp được tạo bởi trình biên dịch C++ hoặc có thể được định nghĩa bởi người dùng
  • Trình xây dựng được gọi bởi trình biên dịch bất cứ khi nào đối tượng của lớp được tạo, nó phân bổ bộ nhớ cho đối tượng và khởi tạo các thành viên dữ liệu của lớp
  • Một hàm hủy được trình biên dịch gọi khi đối tượng bị hủy và chức năng chính của nó là giải phóng bộ nhớ của đối tượng
  • Các hàm tạo có cùng tên của lớp trong khi các hàm hủy có cùng tên của lớp với tiền tố là toán tử dấu ngã (~)
  • Cả Constructor và Destructor đều có thể được định nghĩa là công khai, riêng tư hoặc được bảo vệ. Nhưng tốt hơn hết là khai báo hàm tạo là công khai
  • Hàm tạo có thể có tham số nhưng hàm hủy không nhận được bất kỳ tham số nào
  • Bạn có thể tham khảo liên kết này để hiểu sâu hơn và tốt hơn về chủ đề này

C++ Constructor trong cpp Destructor trong cpp Lập trình C Học c

bài báo cáo

Thưởng thức bài viết này?

4

hợp tác

Rohan Rai

Công nghệ Blogger và nhà tiếp thị nội dung

Tôi đam mê lập trình và thích nói về C, CPP, JS, Python. Tôi là một người ham học hỏi và đam mê du lịch

theo

Khám phá và đọc thêm các bài viết từ Rohan Rai

bắt đầu

Thưởng thức bài viết này?

Để lại một lượt thích và bình luận cho Rohan

4

Kẻ hủy diệt C++
Hãy là người đầu tiên chia sẻ ý kiến ​​của bạn

Kẻ hủy diệt C++
Hỗ trợ đánh dấu hương vị GitHub

Gửi đi

Anthony Anderson

9 tháng trước

Rohan,

Chỉ cho bạn biêt thôi. hàm tạo động của bạn bị rò rỉ bộ nhớ trong đó

Người(int* person_age)
{

cout << "Constructor cho tuoi duoc goi" <

tuổi = int mới;

tuổi = người_tuổi; . Bộ nhớ heap ban đầu được phân bổ trước đó không còn có thể được truy cập. Bộ nhớ bị “rò rỉ”

}

Chỉ cần nghĩ rằng bạn muốn biết

Hồi đáp

Rohan Rai

9 tháng trước

Này Anton,

Cảm ơn nhận xét của bạn, bạn có một điểm hợp lệ

Ý định của tôi chỉ là chỉ ra cách chúng ta có thể cấp phát bộ nhớ động cho bất kỳ biến dữ liệu nào trong hàm tạo động

Kẻ hủy diệt trong C là gì?

Hàm hủy là hàm thành viên được gọi tự động khi đối tượng vượt quá phạm vi hoặc bị hủy rõ ràng bởi lệnh gọi xóa . Một hàm hủy có cùng tên với lớp, trước dấu ngã ( ~ ). Ví dụ, hàm hủy của lớp String được khai báo. ~Chuỗi().

C có hàm hủy không?

Về mặt chức năng, các hàm hủy rất dễ triển khai trong C - đối với mọi biến cục bộ cần hành động ở cuối phạm vi, bạn đăng ký biến đó vào một loại 'đăng ký' theo phạm vi nào đó, rồi sau đó hành động rõ ràng với nội dung của biến đó đăng ký khi rời khỏi phạm vi đã nói - dễ dàng

Làm thế nào để viết một hàm hủy trong C?

Hàm hủy là hàm thành viên có cùng tên với tên lớp của nó có tiền tố là ~ (dấu ngã) . Ví dụ. lớp X {công khai. // Constructor cho class X X();

Kẻ hủy diệt nghĩa là gì?

Định nghĩa của 'kẻ hủy diệt' . lò nung hoặc lò đốt rác thải, đặc biệt là loại sử dụng nhiệt sinh ra để phát điện . 2. một thiết bị được sử dụng để làm nổ tên lửa hoặc tên lửa bị lỗi nguy hiểm sau khi phóng.