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
- Lớp (Class) là khuôn mẫu để tạo đối tượng
- Đối tượng (Object) là thể hiện cụ thể của lớp
- Từ khóa truy cập:
public: Truy cập từ mọi nơiprivate: Chỉ truy cập trong lớpprotected: Truy cập trong lớp và lớp con
- Ư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.