Thứ Ba, 7 tháng 5, 2024

50. Hàm khởi tạo Constructor trong C++ phần 2

Phần trước, chúng ta co nói qua về Hàm khởi tạo sao chép ( Copy Constructor ), tuy nhiên để tránh việc quá tải, chúng ta chuyển việc phân tích qua phần này.

Nhắc lại: 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 đó, mà đã được tạo trước đó.

Chúng ta sẽ sửa lại vài chỗ chương trình của phần trước

  • Xóa lệnh cout << chuyenNganh << endl; trong phương thức inGiaTri()
  • Thêm tham số string b vào hàm khởi tạo SinhVien()
  • Thêm lệnh chuyenNganh = b;
  • Xóa lệnh sinhVienA.chuyenNganh = "CNTT";
  • Xóa lệnh sinhVienB.chuyenNganh = "CNTT";
  • Thay đổi 2 lệnh tạo đối tượng: SinhVien sinhVienA ("Dai Hoc Bach Khoa", "CNTT"); và SinhVien sinhVienB ("Dai Hoc Y Duoc", "Y Khoa");



Đây là chương trình sau khi đã sửa

#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, string b){
         tenTruong = a;
         chuyenNganh = b;
    }

    
};


int main() {
  SinhVien sinhVienA ("Dai Hoc Bach Khoa", "CNTT");  // 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", "Y Khoa");  // 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;
}

Sử dụng IDE Online, chạy chương trình

 

 

Bây giờ chúng ta sẽ tạo một bản copy của hàm khởi tạo SinhVien(). Luôn nhớ rằng đây là hàm (Function) hay phương thức (Method) với tên giống với tên lớp.

SinhVien(SinhVien& t) { // copy constructor
        hoten = t.hoten;
        email = t.email;
        diaChi = t.diaChi;
        tenTruong = "Dai Hoc Tong Hop";
        chuyenNganh = "Tieng Anh";
        diemTrungBinh = 8.7;
    }

Sau đó trong main() chúng ta tạo một đối tượng mới


SinhVien copySinhVienA (sinhVienA);


Cuối cùng, ta cho đối tượng mới copySinhVienA thực thi phương thức inGiaTri2() để in thông tin ra màn hình. Đây là chương trình của chúng ta:

#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, string b){
         tenTruong = a;
         chuyenNganh = b;
    }
    SinhVien(SinhVien& t) { // copy constructor
        hoten = t.hoten;
        email = t.email;
        diaChi = t.diaChi;
        tenTruong = "Dai Hoc Tong Hop";
        chuyenNganh = "Tieng Anh";
        diemTrungBinh = 8.7;
    }

    
};


int main() {
  SinhVien sinhVienA ("Dai Hoc Bach Khoa", "CNTT");  // 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", "Y Khoa");  // 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;
 
  SinhVien copySinhVienA (sinhVienA); // Loi goi copy constructor

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

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

Bấm Run để chạy chương trình


 

Phần tiếp theo


Phần trước






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

Đăng nhận xét