Skip to content

Lớp và Đối tượng (Classes and Objects)

📖 Giới thiệu

Lập trình hướng đối tượng (OOP) là một phương pháp lập trình dựa trên khái niệm đối tượng (objects). Đối tượng chứa dữ liệu (thuộc tính) và code (phương thức). Lớp (class) là khuôn mẫu để tạo ra các đối tượng.

Ví dụ đơn giản đầu tiên

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

// Lớp đơn giản - Sinh viên
class SinhVien {
public:
    string ten;
    int tuoi;
    
    void gioi_thieu() {
        cout << "Tên: " << ten << ", Tuổi: " << tuoi << endl;
    }
};

int main() {
    // Tạo đối tượng
    SinhVien sv1;
    sv1.ten = "Minh";
    sv1.tuoi = 20;
    
    sv1.gioi_thieu(); // Tên: Minh, Tuổi: 20
    return 0;
}

🔧 Cú pháp

Khai báo lớp cơ bản

cpp
class TenLop {
private:
    // Thuộc tính riêng tư
    
public:
    // Thuộc tính công khai
    // Phương thức công khai
    
protected:
    // Thuộc tính được bảo vệ
};

Tạo và sử dụng đối tượng

cpp
// Tạo đối tượng
TenLop doiTuong1;           // Tạo trên stack
TenLop* doiTuong2 = new TenLop(); // Tạo trên heap

// Truy cập thuộc tính và phương thức
doiTuong1.thuocTinh = giaTriNaoDay;
doiTuong1.phuongThuc();

doiTuong2->thuocTinh = giaTriNaoDay;
doiTuong2->phuongThuc();

🔬 Phân tích & Giải thích

Từ khóa truy cập (Access Specifiers)

1. public: Có thể truy cập từ bất kỳ đâu

cpp
class XeHoi {
public:
    string mauSac;  // Ai cũng có thể xem và thay đổi
    void khoi_dong() {
        cout << "Xe đã khởi động!" << endl;
    }
};

2. private: Chỉ có thể truy cập trong lớp đó

cpp
class TaiKhoan {
private:
    double soDu;    // Chỉ lớp này mới truy cập được
    
public:
    void gui_tien(double tien) {
        if (tien > 0) {
            soDu += tien;
        }
    }
};

3. protected: Truy cập được trong lớp và lớp con

cpp
class ConVat {
protected:
    int tuoi;       // Lớp con có thể truy cập
    
public:
    void an() {
        cout << "Đang ăn..." << endl;
    }
};

💻 Ví dụ minh họa

Ví dụ 1: Lớp Điện thoại đơn giản

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

class DienThoai {
public:
    string hang;
    string mau;
    int dungLuong;
    
    void hien_thong_tin() {
        cout << "=== THÔNG TIN ĐIỆN THOẠI ===" << endl;
        cout << "Hãng: " << hang << endl;
        cout << "Màu: " << mau << endl;
        cout << "Dung lượng: " << dungLuong << "GB" << endl;
    }
    
    void goi_dien_thoai(string so) {
        cout << "Đang gọi đến số: " << so << endl;
    }
};

int main() {
    // Tạo điện thoại
    DienThoai dt1;
    dt1.hang = "iPhone";
    dt1.mau = "Đen";
    dt1.dungLuong = 128;
    
    DienThoai dt2;
    dt2.hang = "Samsung";
    dt2.mau = "Xanh";
    dt2.dungLuong = 256;
    
    // Sử dụng
    dt1.hien_thong_tin();
    dt1.goi_dien_thoai("0987654321");
    
    cout << "\n";
    dt2.hien_thong_tin();
    
    return 0;
}

Ví dụ 2: Lớp Ngân hàng với bảo mật

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

class TaiKhoanNganHang {
private:
    string soTaiKhoan;
    double soDu;
    string matKhau;
    
public:
    string tenChuTaiKhoan;
    
    // Khởi tạo tài khoản
    void tao_tai_khoan(string ten, string so, string mk, double duDau) {
        tenChuTaiKhoan = ten;
        soTaiKhoan = so;
        matKhau = mk;
        soDu = duDau;
        cout << "Tài khoản " << so << " đã được tạo thành công!" << endl;
    }
    
    // Gửi tiền
    void gui_tien(double tien) {
        if (tien > 0) {
            soDu += tien;
            cout << "Đã gửi " << tien << " VND. Số dư hiện tại: " << soDu << " VND" << endl;
        } else {
            cout << "Số tiền gửi phải lớn hơn 0!" << endl;
        }
    }
    
    // Rút tiền
    void rut_tien(double tien, string mk) {
        if (mk != matKhau) {
            cout << "Mật khẩu không đúng!" << endl;
            return;
        }
        
        if (tien <= 0) {
            cout << "Số tiền rút phải lớn hơn 0!" << endl;
            return;
        }
        
        if (tien > soDu) {
            cout << "Số dư không đủ!" << endl;
            return;
        }
        
        soDu -= tien;
        cout << "Đã rút " << tien << " VND. Số dư còn lại: " << soDu << " VND" << endl;
    }
    
    // Kiểm tra số dư
    void kiem_tra_so_du(string mk) {
        if (mk == matKhau) {
            cout << "Số dư hiện tại: " << soDu << " VND" << endl;
        } else {
            cout << "Mật khẩu không đúng!" << endl;
        }
    }
};

int main() {
    TaiKhoanNganHang tk1;
    
    // Tạo tài khoản
    tk1.tao_tai_khoan("Nguyễn Văn A", "123456789", "matkhau123", 1000000);
    
    // Thực hiện các giao dịch
    tk1.gui_tien(500000);
    tk1.kiem_tra_so_du("matkhau123");
    tk1.rut_tien(200000, "matkhau123");
    tk1.rut_tien(100000, "saimatkhau");  // Mật khẩu sai
    
    return 0;
}

Ví dụ 3: Game quản lý nhân vật

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

class NhanVat {
private:
    int mau;
    int mana;
    
public:
    string ten;
    int level;
    int kinh_nghiem;
    
    // Khởi tạo nhân vật
    void tao_nhan_vat(string tenNV, int lvl = 1) {
        ten = tenNV;
        level = lvl;
        mau = level * 100;
        mana = level * 50;
        kinh_nghiem = 0;
        
        cout << "Nhân vật " << ten << " đã được tạo!" << endl;
        hien_thong_tin();
    }
    
    // Tấn công
    void tan_cong(string muc_tieu) {
        if (mana >= 10) {
            mana -= 10;
            cout << ten << " tấn công " << muc_tieu << "!" << endl;
            cout << "Mana còn lại: " << mana << endl;
        } else {
            cout << ten << " không đủ mana để tấn công!" << endl;
        }
    }
    
    // Hồi phục
    void hoi_phuc() {
        mau = level * 100;
        mana = level * 50;
        cout << ten << " đã hồi phục hoàn toàn!" << endl;
    }
    
    // Lên cấp
    void len_cap() {
        kinh_nghiem += 100;
        if (kinh_nghiem >= level * 200) {
            level++;
            kinh_nghiem = 0;
            mau = level * 100;
            mana = level * 50;
            cout << ten << " đã lên cấp " << level << "!" << endl;
        }
    }
    
    // Hiển thị thông tin
    void hien_thong_info() {
        cout << "=== " << ten << " ===" << endl;
        cout << "Level: " << level << endl;
        cout << "Máu: " << mau << "/" << (level * 100) << endl;
        cout << "Mana: " << mana << "/" << (level * 50) << endl;
        cout << "Kinh nghiệm: " << kinh_nghiem << "/" << (level * 200) << endl;
        cout << "===============" << endl;
    }
};

int main() {
    NhanVat hero;
    hero.tao_nhan_vat("Chiến Binh", 1);
    
    // Chiến đấu
    hero.tan_cong("Quái vật");
    hero.tan_cong("Boss");
    hero.len_cap();
    hero.hien_thong_tin();
    
    hero.hoi_phuc();
    hero.hien_thong_tin();
    
    return 0;
}

🏋️ Thực hành

Bài tập 1: Tạo lớp Ô tô

Tạo lớp OTo với:

  • Thuộc tính: hang, mau, gia, tocDoHienTai
  • Phương thức: tang_toc(), giam_toc(), hien_thong_tin()

Bài tập 2: Lớp Sách

Tạo lớp Sach với:

  • Thuộc tính riêng: gia
  • Thuộc tính công khai: tenSach, tacGia
  • Phương thức: dat_gia(), xem_gia(), thong_tin_sach()

Bài tập 3: Game RPG

Tạo lớp QuaiVat với:

  • Thuộc tính riêng: mau, satThuong
  • Phương thức: tan_cong(), nhan_sat_thuong(), kiem_tra_song()

📋 Tóm tắt

  1. Lớp (Class) là khuôn mẫu để tạo đối tượng
  2. Đối tượng (Object) là thể hiện cụ thể của lớp
  3. Từ khóa truy cập:
    • public: Truy cập từ mọi nơi
    • private: Chỉ truy cập trong lớp
    • protected: Truy cập trong lớp và lớp con
  4. Ưu điểm OOP: Tái sử dụng code, dễ bảo trì, tổ chức tốt hơn

Bài tiếp theo: Hàm khởi tạo - Học cách khởi tạo đối tượng tự động.

Khóa học C++ miễn phí