Lập trình hướng đối tượng (OOP) là một phương pháp luận tập trung vào việc tổ chức mã nguồn xung quanh các đối tượng thay vì logic hành động. Ba trụ cột chính của OOP bao gồm: Đóng gói (Encapsulation), Kế thừa (Inheritance) và Đa hình (Polymorphism).
1. Ý nghĩa của tính Đóng gói
Đóng gói là việc kết hợp các thuộc tính (dữ liệu) và hành vi (hàm) vào một đơn vị duy nhất gọi là lớp (Class). Điều này giúp mô phỏng các thực thể trong đời thực một cách trực quan hơn.
Cấu trúc cơ bản:
class TenLop {
// Quyền truy cập
// Thuộc tính (Biến thành viên)
// Hành vi (Hàm thành viên)
};
Ví dụ về lớp Hình Tròn:
#include <iostream>
using namespace std;
const double PI_VAL = 3.14159;
class RoundShape {
public:
// Thuộc tính
double radius;
// Hành vi: Tính chu vi
double getPerimeter() {
return 2 * PI_VAL * radius;
}
};
int main() {
// Khởi tạo đối tượng từ lớp
RoundShape circle1;
circle1.radius = 5.5;
cout << "Chu vi hinh tron: " << circle1.getPerimeter() << endl;
return 0;
}
2. Quản lý thông tin qua Lớp
Chúng ta có thể sử dụng phương thức để gán giá trị hoặc truy xuất dữ liệu, giúp kiểm soát tốt hơn cách dữ liệu được thay đổi.
Ví dụ quản lý thông tin sinh viên:
#include <iostream>
#include <string>
using namespace std;
class Learner {
public:
string fullName;
int studentID;
void displayInfo() {
cout << "Ten: " << fullName << " | MSSV: " << studentID << endl;
}
void setDetails(string name, int id) {
fullName = name;
studentID = id;
}
};
int main() {
Learner st;
st.setDetails("Nguyen Van A", 202301);
st.displayInfo();
return 0;
}
3. Quyền truy cập (Access Modifiers)
Trong C++, tính đóng gói còn được thể hiện qua việc kiểm soát quyền truy cập vào các thành viên của lớp:
- public: Có thể truy cập từ bất kỳ đâu (trong và ngoài lớp).
- protected: Chỉ có thể truy cập bên trong lớp hoặc từ lớp con kế thừa.
- private: Chỉ có thể truy cập bên trong chính lớp đó.
Sự khác biệt giữa
struct và
class:
- Đối với
struct, quyền truy cập mặc định là
public.
- Đối với
class, quyền truy cập mặc định là
private.
4. Thực hành: Xây dựng lớp Hình khối
Sử dụng các thành viên
private để bảo vệ dữ liệu và cung cấp các hàm
public (Getter/Setter) để tương tác.
#include <iostream>
using namespace std;
class Box {
public:
void setDimensions(double l, double w, double h) {
length = l;
width = w;
height = h;
}
double calcVolume() {
return length * width * height;
}
// So sánh với một đối tượng Box khác
bool isEqual(Box &other) {
return (length == other.length && width == other.width && height == other.height);
}
private:
double length;
double width;
double height;
};
int main() {
Box b1, b2;
b1.setDimensions(10, 5, 2);
b2.setDimensions(10, 5, 2);
if (b1.isEqual(b2)) {
cout << "Hai khoi hop giong nhau." << endl;
}
return 0;
}
5. Ví dụ nâng cao: Quan hệ giữa Điểm và Đường tròn
Lớp có thể chứa đối tượng của một lớp khác làm thuộc tính.
#include <iostream>
using namespace std;
class Coordinate {
public:
void setPos(int x, int y) { posX = x; posY = y; }
int getX() { return posX; }
int getY() { return posY; }
private:
int posX, posY;
};
class Circle {
public:
void setRadius(int r) { radius = r; }
void setCenter(Coordinate p) { center = p; }
void checkRelation(Coordinate p) {
int distSq = (center.getX() - p.getX()) * (center.getX() - p.getX()) +
(center.getY() - p.getY()) * (center.getY() - p.getY());
int radiusSq = radius * radius;
if (distSq == radiusSq) cout << "Diem nam tren duong tron" << endl;
else if (distSq > radiusSq) cout << "Diem nam ngoai duong tron" << endl;
else cout << "Diem nam trong duong tron" << endl;
}
private:
int radius;
Coordinate center;
};
int main() {
Coordinate centerPoint;
centerPoint.setPos(0, 0);
Circle myCircle;
myCircle.setRadius(5);
myCircle.setCenter(centerPoint);
Coordinate targetPoint;
targetPoint.setPos(3, 4);
myCircle.checkRelation(targetPoint);
return 0;
}