Hàm dựng hàm hủy nó hoạt động như thế nào năm 2024

Chào cả nhà! Trong bài viết này, chúng ta sẽ tìm hiểu về hai hàm thành viên quan trọng của lớp - hàm khởi tạo và hàm huỷ. Hàm Khởi Tạo [Constructor] Hàm khởi tạo...

Your browser does not support the audio element.

Chào cả nhà! Trong bài viết này, chúng ta sẽ tìm hiểu về hai hàm thành viên quan trọng của lớp - hàm khởi tạo và hàm huỷ.

Hàm Khởi Tạo [Constructor]

Hàm khởi tạo là gì?

Hàm khởi tạo là một hàm thành viên đặc biệt của một lớp. Nó sẽ được tự động gọi khi một đối tượng của lớp đó được khởi tạo.

Sự khác biệt giữa hàm tạo và hàm thành viên thông thường

Một hàm tạo khác với các hàm thông thường ở những điểm sau:

  • Có tên trùng với tên lớp.
  • Không có kiểu dữ liệu trả về [kể cả kiểu void].
  • Tự động được gọi khi một đối tượng thuộc lớp được tạo ra.
  • Nếu không khai báo một hàm tạo, trình biên dịch sẽ tự động tạo một hàm tạo mặc định cho chúng ta [hàm không có tham số và có phần thân trống].

Hàm tạo có thể rất hữu ích để thiết lập các giá trị khởi tạo cho các biến thành viên cụ thể.

Ví dụ đơn giản về hàm khởi tạo:

class sinhvien {      private:          string ten;          int tuoi;      public:          sinhvien[]; // Đây là hàm khởi tạo          ~sinhvien[];  };

Các loại hàm khởi tạo

Hàm khởi tạo về cơ bản được chia làm 3 loại:

  1. Hàm khởi tạo không tham số [Cũng có thể gọi là hàm tạo mặc định - Default Constructor].
  2. Hàm khởi tạo có tham số [Parameterized Constructor].
  3. Hàm khởi tạo sao chép [Copy Constructor].

Hàm khởi tạo không tham số [Default Constructor]

Hàm tạo loại này không truyền vào bất kỳ một đối số nào.

class sinhvien {      private:          string ten;          int tuoi;      public:          sinhvien[] {              this->ten = "";              this->tuoi = 0;          }          ~sinhvien[];  }

Trong ví dụ trên, hàm tạo

class sinhvien {      private:          string ten;          int tuoi;      public:          sinhvien[] {              this->ten = "";              this->tuoi = 0;          }          ~sinhvien[];  }

1 không có đối số nào được truyền vào. Theo ý kiến riêng của mình, thông thường trong hàm loại này, mình sẽ gán cho tất cả các thuộc tính giá trị mặc định.

Trong ví dụ trên:

  • Thuộc tính

    class sinhvien { private: string ten; int tuoi; public: sinhvien[] { this->ten = ""; this->tuoi = 0; } ~sinhvien[]; }

    2 thuộc kiểu

    class sinhvien { private: string ten; int tuoi; public: sinhvien[] { this->ten = ""; this->tuoi = 0; } ~sinhvien[]; }

    3 sẽ được gán giá trị mặc định là một chuỗi rỗng

    class sinhvien { private: string ten; int tuoi; public: sinhvien[] { this->ten = ""; this->tuoi = 0; } ~sinhvien[]; }

    4.
  • Thuộc tính

    class sinhvien { private: string ten; int tuoi; public: sinhvien[] { this->ten = ""; this->tuoi = 0; } ~sinhvien[]; }

    5 thuộc kiểu

    class sinhvien { private: string ten; int tuoi; public: sinhvien[] { this->ten = ""; this->tuoi = 0; } ~sinhvien[]; }

    6 sẽ được gán giá trị mặc định là 0.

Hàm khởi tạo có tham số [Parameterized Constructor]

Với loại hàm khởi tạo này, ta có thể truyền đối số vào.

Để khai báo một hàm khởi tạo có tham số, chỉ cần thêm các tham số vào như cách bạn thêm tham số vào bất kỳ hàm nào. Khi xác định phần thân của hàm tạo, hãy sử dụng các tham số để khởi tạo đối tượng.

class sinhvien {      private:          string ten;          int tuoi;      public:          sinhvien[string param_ten, int param_tuoi] {              this->ten = param_ten;              this->tuoi = param_tuoi;          }          ~sinhvien[];  };

Sau khi khai báo hàm trong lớp, ta có thể dễ dàng sử dụng nó bằng cách truyền tham số trong quá trình khởi tạo đối tượng.

int main[] {      sinhvien obj["Lap Trinh Khong Kho", 5]; // Ta truyền luôn tham số trong quá trình khởi tạo đối tượng  }

  • Lưu ý:
    • Khi một đối tượng được khai báo trong hàm khởi tạo có tham số, các giá trị ban đầu phải được truyền dưới dạng đối số cho hàm tạo.
    • Cách khai báo đối tượng bình thường có thể gây lỗi. Điều này có nghĩa là thay vì khai báo một đối tượng bình thường như sau:
       sinhvien obj;  
      

      Ta phải khai báo như sau:

       sinhvien obj["Lap Trinh Khong Kho", 5];  
      
    • Các hàm khởi tạo có thể được gọi một cách rõ ràng hoặc ngầm định. Ví dụ:
       sinhvien obj = sinhvien["Lap Trinh Khong Kho", 5]; // Đây là cách rõ ràng   sinhvien obj["Lap Trinh Khong Kho", 5]; // Đây là cách ngầm định  
      
      Thông thường, để tiết kiệm code, chúng ta thường sử dụng cách ngầm định hơn.
Công dụng của hàm khởi tạo có tham số
  • Nó được sử dụng để khởi tạo các thành phần dữ liệu khác nhau của các đối tượng khác nhau với các giá trị khác nhau khi chúng được tạo.
  • Nó được sử dụng để nạp chồng các hàm khởi tạo. Nạp chồng có nghĩa là ta có nhiều hơn một hàm khởi tạo trong cùng một lớp.

Hàm khởi tạo sao chép [Copy Constructor]

Hàm khởi tạo sao chép là gì?

Hàm khởi tạo sao chép là một hàm tạo mà tạo một đối tượng bằng việc khởi tạo nó với một đối tượng của cùng lớp, đã được tạo trước đó.

Một hàm khởi tạo sao chép sẽ có nguyên mẫu chung như sau:

ClassName[const ClassName &old_obj] { // Code }

Trong đó

class sinhvien {      private:          string ten;          int tuoi;      public:          sinhvien[] {              this->ten = "";              this->tuoi = 0;          }          ~sinhvien[];  }

7 là tên của lớp,

class sinhvien {      private:          string ten;          int tuoi;      public:          sinhvien[] {              this->ten = "";              this->tuoi = 0;          }          ~sinhvien[];  }

8 là đối tượng cũ sẽ lấy làm gốc để sao chép sang đối tượng mới.

Ví dụ đơn giản về hàm khởi tạo sao chép:


# include   using namespace std;   class Point {      private:          int x, y;      public:          Point[int x1, int y1]          {              x = x1;              y = y1;          }           // Hàm khởi tạo sao chép          Point[const Point &p2]          {              x = p2.x;              y = p2.y;          }           int getX[]          {              return x;          }          int getY[]          {              return y;          }  };   int main[]  {      Point p1[10, 15]; // Hàm khởi tạo có tham số thông thường       Point p2 = p1; // hàm khởi tạo sao chép được gọi ở đây       cout 

Chủ Đề