Bài 49. Lớp và đối tượng
Nội dung bài học
- Định nghĩa
- Đặc điểm của lớp
- Cú pháp khai báo tổng quát
- Sử dụng đối tượng của lớp
- Phân tách khai báo và định nghĩa hàm thành phần
- Ví dụ minh họa
- Bài tập thực hành
Video lý thuyết
Video minh họa
Định nghĩa
- Lớp là một kiểu dữ liệu người dùng tự định nghĩa.
- Một lớp có thể chứa cả dữ liệu và hành động liên quan đến các dữ liệu đó.
- Nói cách khác, một lớp là bản thiết kế mà sản phẩm tạo ra từ bản thiết kế đó được gọi là các đối tượng.
- Dễ hình dung hơn, coi lớp là khuôn làm bánh thì đối tượng của nó là những chiếc bánh được tạo ra từ cái khuôn đó.
- Các đối tượng được tạo ra từ một lớp có chung các hành vi và đặc điểm nhận biết.
Đặc điểm
- Dữ liệu của lớp là các biến khai báo trong lớp đó, nó được gọi là các thuộc tính.
- Hàm thành phần của lớp là các hàm khai báo trong lớp đó, nó gọi là các phương thức của lớp. Phương thức liên quan đến hành động của lớp.
- Các phương thức của một lớp thường được vận hành dựa trên các thuộc tính của lớp.
- Khi một lớp được tạo ra, chưa có sự cấp phát bộ nhớ nào nhưng khi đối tượng được tạo ra, nó sẽ được cấp phát bộ nhớ để thực hiện các chức năng cần thiết.
Cú pháp khai báo tổng quát
- Sau đây là cú pháp tổng quát khai báo một lớp:
class ClassName {
accessSpecifier1:
member1a;
member1b;
...
accessSpecifier2:
member2a;
member2b;
...
} objectNames;
- Trong đó:
- Một lớp bắt đầu với keyword class theo sau đó là tên lớp
- ClassName là tên lớp, thường là danh từ hoặc cụm danh từ chỉ tên của thực thể nào đó mà lớp muốn mô tả, ví dụ: Person, Student, Money…
- accessSpecifier1, 2 là các chỉ định truy cập. Nó có thể là private, public hoặc protected. Chi tiết ta sẽ tìm hiểu qua từng bài học.
- member1a,… là các thành phần dữ liệu hoặc hành động của lớp
- objectName: Có thể khai báo các đối tượng của lớp ngay khi khai báo lớp, chúng sẽ là các đối tượng tương tự biến toàn cục(không khuyến khích)
- Kết thúc khai báo lớp là dấu chấm phẩy(bắt buộc)
Ví dụ
#include <iostream>
using namespace std;
class Person { // tên lớp
public: // access specifier
// các thuộc tính
string idNumber; // số chứng minh/căn cước
int age; // tuổi
string fullName; // họ tên
string address; // địa chỉ
string email; // email
string phoneNum; // số điện thoại
// các phương thức
void setFullName(string fullName) {
this->fullName = fullName;
}
string getFullName() {
return fullName;
}
void move();
void eat();
void goToWork();
void speak();
void sleep();
};
- Ví dụ 2:
#include <iostream>
using namespace std;
class Cat {
public:
string name;
int age;
string favoriteFood;
string color;
Cat() {
}
Cat(string name, int age) : name(name), age(age) {
}
void catInfo() {
cout << "Name: " << name << endl;
cout << "Age: " << age << endl;
cout << "Color: " << color << endl;
cout << "Favorite food: " << favoriteFood << endl;
}
void move() {
cout << name << " is running on the ground." << endl;
}
void sleep() {
cout << name << " is sleeping buzz buzz buzz...!!!" << endl;
}
};
Cú pháp sử dụng đối tượng của lớp
- Cú pháp tạo đối tượng của lớp: ClassName objectName;
- Cú pháp truy cập đến một thành phần của lớp:
Từ bên trong lớp: gọi trực tiếp tên thành phần;
Từ bên ngoài lớp: objectName.memberName; - Nếu objectName là con trỏ: thay . bởi ->: objetPtr->memberName;
int main() {
Cat tom; // khai báo đối tượng tom của lớp Cat
Cat* catPtr = &tom;
tom.age = 5; // truy cập thuộc tính age
tom.color = "Black";
tom.name = "Tom";
tom.favoriteFood = "Fish";
// truy cập phương thức:
cout << "============== Cat infomation ==============\n";
tom.catInfo();
// truy cập bằng con trỏ
catPtr->name = "Maomao";
catPtr->age = 2;
cout << "============== Cat infomation ==============\n";
catPtr->catInfo();
Cat miu { "MiuMiu", 3 };
miu.catInfo();
return 0;
}
- Ví dụ đầy đủ:
#include <iostream>
using namespace std;
class Cat {
public:
string name;
int age;
string favoriteFood;
string color;
Cat() {
}
Cat(string name, int age) : name(name), age(age) {
}
void catInfo() {
cout << "Name: " << name << endl;
cout << "Age: " << age << endl;
cout << "Color: " << color << endl;
cout << "Favorite food: " << favoriteFood << endl;
}
void move() {
cout << name << " is running on the ground." << endl;
}
void sleep() {
cout << name << " is sleeping buzz buzz buzz...!!!" << endl;
}
};
int main() {
Cat tom; // khai báo đối tượng tom của lớp Cat
Cat* catPtr = &tom;
tom.age = 5; // truy cập thuộc tính age
tom.color = "Black";
tom.name = "Tom";
tom.favoriteFood = "Fish";
// truy cập phương thức:
cout << "============== Cat infomation ==============\n";
tom.catInfo();
// truy cập bằng con trỏ
catPtr->name = "Maomao";
catPtr->age = 2;
cout << "============== Cat infomation ==============\n";
catPtr->catInfo();
Cat miu { "MiuMiu", 3 };
miu.catInfo();
return 0;
}
============== Cat infomation ==============
Name: Tom
Age: 5
Color: Black
Favorite food: Fish
============== Cat infomation ==============
Name: Maomao
Age: 2
Color: Black
Favorite food: Fish
Name: MiuMiu
Age: 3
Color:
Favorite food:
Phân tách khai báo và định nghĩa
- Ta có thể phân tách việc khai báo nguyên mẫu hàm và định nghĩa hàm thành phần của lớp.
- Tại nơi khai báo, bên trong phần thân của lớp: chỉ cung cấp nguyên mẫu hàm.
- Tại nơi định nghĩa: định nghĩa chi tiết hành vi cần thực hiện của hàm.
- Do việc định nghĩa hàm ở ngoài lớp nên sau kiểu của hàm và trước tên hàm ta có ClassName:: với ClassName là tên lớp chứa khai báo nguyên mẫu hàm.
- Ví dụ:
class Cat {
public:
string name;
int age;
string favoriteFood;
string color;
Cat() {
}
Cat(string name, int age) : name(name), age(age) {
}
// khai báo nguyên mẫu
void catInfo();
void move();
void sleep();
};
void Cat::catInfo() {
cout << "Name: " << name << endl;
cout << "Age: " << age << endl;
cout << "Color: " << color << endl;
cout << "Favorite food: " << favoriteFood << endl;
}
void Cat::move() {
cout << name << " is running on the ground." << endl;
}
void Cat::sleep() {
cout << name << " is sleeping buzz buzz buzz...!!!" << endl;
}
Bài tập thực hành
Tải đề bài: Click vào đây
Lời giải mẫu:Click vào đây