Menu
CoddyTech

Giới thiệu về nạp chồng toán tử

Thuộc phần Lập trình hướng đối tượng trong hành trình C++ của Coddy. Bài học 40 trên 104.

Quá tải toán tử cho phép bạn định nghĩa cách các toán tử như +, - hoặc == hoạt động khi dùng với các lớp tùy chỉnh. Thay vì gọi các phương thức như a.add(b), bạn có thể viết a + b trực quan hơn.

Trong C++, toán tử về cơ bản là các hàm có tên đặc biệt. Để nạp chồng toán tử, bạn định nghĩa một hàm bằng từ khóa operator, theo sau là ký hiệu:

class Vector2D {
    double x, y;
    
public:
    Vector2D(double x, double y) : x(x), y(y) {}
    
    // Nạp chồng toán tử +
    Vector2D operator+(const Vector2D& other) const {
        return Vector2D(x + other.x, y + other.y);
    }
};

Giờ bạn có thể cộng hai vectơ một cách tự nhiên:

Vector2D v1(1.0, 2.0);
Vector2D v2(3.0, 4.0);
Vector2D v3 = v1 + v2;    // Gọi v1.operator+(v2)

Không phải toán tử nào cũng có thể được nạp chồng. Toán tử phân giải phạm vi ::, truy cập thành viên ., toán tử ba ngôi ?: và sizeof không thể được nạp chồng. Ngoài ra, bạn không thể tạo toán tử mới hoặc thay đổi độ ưu tiên của toán tử, * luôn được tính trước +.

Bạn có thể triển khai toán tử (operator) dưới dạng hàm thành viên (member function) như ở trên hoặc hàm không phải thành viên (non-member function). Trong các bài học tiếp theo, bạn sẽ tìm hiểu khi nào nên dùng từng cách và cách nạp chồng các nhóm toán tử cụ thể.

challenge icon

Thử thách

Dễ

Hãy tạo một lớp Point đại diện cho tọa độ 2D và hỗ trợ cộng hai điểm với nhau bằng toán tử +. Đây là bước đầu tiên để bạn tìm hiểu về nạp chồng toán tử, giúp các lớp tùy chỉnh hoạt động với những toán tử quen thuộc.

Bạn sẽ tạo hai tệp để sắp xếp code:

  • Point.h: Định nghĩa lớp Point lưu tọa độ x và y (cả hai đều có kiểu int). Lớp của bạn cần có:
    • Các thành viên private lưu tọa độ x và y
    • Một hàm khởi tạo nhận giá trị x và y
    • Các hàm getter getX() và getY() (cả hai đều là const)
    • Một toán tử + được nạp chồng để cộng hai điểm với nhau và trả về một Point mới có tọa độ là tổng của hai điểm

    Hãy triển khai toán tử + dưới dạng hàm thành viên, nhận một Point khác qua tham chiếu const và trả về một Point mới. Đánh dấu hàm là const vì hàm không sửa đổi toán hạng nào.

  • main.cpp: Đọc bốn số nguyên từ đầu vào (x1, y1, x2, y2 trên các dòng riêng biệt), biểu diễn hai điểm. Tạo hai đối tượng Point, cộng chúng bằng toán tử + rồi hiển thị kết quả.

    Định dạng đầu ra:

    Point 1: (<x1>, <y1>)
    Point 2: (<x2>, <y2>)
    Sum: (<sum_x>, <sum_y>)

Điểm mấu chốt ở đây là p1 + p2 thực chất gọi p1.operator+(p2) ở phía sau. Toán tử được nạp chồng cho phép bạn viết code trực quan như Point p3 = p1 + p2; thay vì viết như Point p3 = p1.add(p2);.

Chuyển các chuỗi đầu vào thành số nguyên bằng std::stoi(). Đừng quên các header guard trong tệp header.

Tự làm thử

#include <iostream>
#include <string>
#include "Point.h"

using namespace std;

int main() {
    // Đọc đầu vào
    string line1, line2, line3, line4;
    getline(cin, line1);
    getline(cin, line2);
    getline(cin, line3);
    getline(cin, line4);

    int x1 = stoi(line1);
    int y1 = stoi(line2);
    int x2 = stoi(line3);
    int y2 = stoi(line4);

    // TODO: Tạo hai đối tượng Point từ các giá trị đầu vào

    // TODO: Cộng hai điểm bằng toán tử +

    // TODO: In kết quả theo đúng định dạng yêu cầu:
    // Point 1: (<x1>, <y1>)
    // Point 2: (<x2>, <y2>)
    // Sum: (<sum_x>, <sum_y>)

    return 0;
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch C++ online