Thứ Ba, 7 tháng 5, 2024

49. Hàm khởi tạo Constructor trong C++

Hàm khởi tạo (Constructor)

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 đến 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 sẽ khác những 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 chúng ta không khai báo một hàm tạo, trình biên dịch C++ sẽ tự động tạo một hàm tạo mặc định cho chúng ta (sẽ là hàm ​​không có tham số nào 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ể.

Để tạo hàm tạo, hãy sử dụng cùng tên với lớp, theo sau là dấu ngoặc đơn ()

Khái niệm hơi trừu tượng và khó hiểu, vì vậy chúng ta thử luôn với chương trình trong phần trước

Chúng ta thêm một thuộc tính (Attribute) string tenTruong;vào lớp SinhVien. 

Sau đó chúng ta định nghĩa hàm khởi tạo như sau

SinhVien(){
         tenTruong = "Dai Hoc Bach Khoa";
    }

Cuối cùng ta thêm một dòng lệnh sau vào định nghĩa phương thức inGiaTri2()

cout << tenTruong << endl;

Sử dụng IDE Online để  chạy chương trình, chúng ta sẽ thấy tên trường Dai Hoc Bach Khoa được thêm vào thông tin của các sinh viên.


Tạm hiểu như sau:

Nếu chúng ta không làm gì, trình biên dịch C++ sẽ tự động tạo một hàm mặc định cho chúng ta và nó không "động chạm" gì tới chúng ta. Nếu ta muốn tạo ra một thứ gì đó bất biến chẳng hạn như tên trường Đại học Bách khoa chẳng hạn, thì ta có thể định nghĩa trong hàm khởi tạo là hàm có cùng tên với lớp.

Hàm khởi tạo được chia làm 3 loại:

  • Hàm khởi tạo không tham số (Hàm tạo mặc định – Default Constructor )
  • Hàm khởi tạo có tham số ( Parameterized Constructor )
  • Hàm khởi tạo sao chép ( Copy Constructor )

Chúng ta đã thử hàm khởi tạo không tham số với việc thêm tên trường trong ví dụ trên.

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

Chúng ta sẽ thêm tham số vào hàm khởi tạo trong chương trình của chúng ta, để không phải "xóa hết làm lại", chúng ta chỉ dùng tham số cho tên trường như sau:

SinhVien(string a){
         tenTruong = a;
    }

Sau đó mỗi khi tạo một đối tượng mới, chúng ta sẽ truyền tham số tên trường cho các đối tượng đó, tương tự thế này

SinhVien sinhVienA ("Dai Hoc Bach Khoa");


Đây là chương trình hiện tại

#include <iostream>
#include <string>
using namespace std;

class SinhVien {       // Tên lớp
  public:             // Access specifier
    string tenTruong;     // Thuộc tinh- Attribute  (biến string)
    string hoten;     // Thuộc tinh- Attribute  (biến string)
    string email;     // Thuộc tinh- Attribute  (biến string)
    string diaChi;    // Thuộc tinh- Attribute  (biến string)
    string chuyenNganh; // Thuộc tinh- Attribute  (biến string)
    double diemTrungBinh; // Thuộc tinh- Attribute  (biến double)
    void inGiaTri() {  // Phuong thuc inGiaTri dinh nghia ben trong Lop
        cout << diemTrungBinh << endl;
          cout << hoten << endl;
          cout << email << endl;
          cout << diaChi << endl;
          cout << chuyenNganh << endl;
         
    }
    void inGiaTri2();
    SinhVien(string a){
         tenTruong = a;
    }

    
};


int main() {
  SinhVien sinhVienA ("Dai Hoc Bach Khoa");  // Tạo một object từ Class SinhVien

  // Access attributes and set values
  sinhVienA.hoten = "Nguyen Van A";
  sinhVienA.email = "nguyenvana@email.com";
  sinhVienA.diaChi = "56 HV Da Nang";
  sinhVienA.chuyenNganh = "CNTT";
  sinhVienA.diemTrungBinh = 9.2;

 
 
   SinhVien sinhVienB ("Dai Hoc Y Duoc");  // Tạo một object khác từ Class SinhVien

  // Access attributes and set values
  sinhVienB.hoten = "Tran Van B";
  sinhVienB.email = "tranvanb@email.com";
  sinhVienB.diaChi = "87 HV Da Nang";
  sinhVienB.chuyenNganh = "CNTT";
  sinhVienB.diemTrungBinh = 8.5;


  sinhVienA.inGiaTri2();
  sinhVienB.inGiaTri2();
 
  return 0;
}

void SinhVien::inGiaTri2() {
  cout << diemTrungBinh << endl;
  cout << hoten << endl;
  cout << email << endl;
  cout << diaChi << endl;
  cout << chuyenNganh << endl;
  cout << tenTruong << endl;
}

Chạy chương trình:



Hàm khởi tạo sao chép ( Copy Constructor ) 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 đó, mà đã được tạo trước đó.


Phần tiếp theo


Phần trước


Không có nhận xét nào:

Đăng nhận xét