Operator overloading là gì?

Phrase Programming
ad hoc polymorphism
Nạp chồng toán tử

Trong C++ chúng ta có thể thay đổi cách thức hoạt động của các toán tử (operator) đối với các kiểu dữ liệu do người dùng định nghĩa (user-defined type) như đối tượng (object) và structure. Điều này được gọi là nạp chồng toán tử (operator overloading). Ví dụ: giả sử chúng ta đã tạo hai đối tượng c1, c2 từ một lớp có tên là Complex đại diện cho các số phức (complex number). Vì việc nạp chồng toán tử (operator overloading) cho phép chúng ta thay đổi cách hoạt động của toán tử, chúng ta có thể định nghĩa lại cách hoạt động của toán tử + và sử dụng nó để cộng các số phức c1 và c2 bằng cách viết đoạn code sau:


result = c1 + c2;

Thay vì một cái gì đó như


result = c1.addNumbers(c2);

Điều này làm cho code của chúng ta trực quan và dễ hiểu.

Chúng ta không thể sử dụng tính năng nạp chồng toán tử (operator overloading) cho các kiểu dữ liệu cơ bản như int, float, char, v.v.

Để nạp chồng một toán tử, chúng ta sử dụng một hàm toán tử đặc biệt. Chúng ta định nghĩa hàm bên trong lớp hoặc structure có các đối tượng / biến mà chúng tôi muốn toán tử được nạp chồng.


class className {
    ... .. ...
    public
       returnType operator symbol (arguments) {
           ... .. ...
       } 
    ... .. ...
};

Ở đây,

  • returnType là kiểu trả về của hàm.
  • operator là một từ khóa (keyword).
  • symbol là toán tử mà chúng ta muốn nạp chồng ví dụ như: +,
  • arguments là các đối số (argument) được truyền cho hàm.

Dưới đây là ví dụ về nạp chồng toán tử một ngôi ++:


class Count {
   private:
    int value;

   public:

    // Constructor to initialize count to 5
    Count() : value(5) {}

    // Overload ++ when used as prefix
    void operator ++ () {
        ++value;
    }

    void display() {
        cout 

Output:


Count: 6

Ở đây khi chúng ta sử dụng ++ count1 ;, void operator ++ () được gọi. Điều này làm tăng thuộc tính value của đối tượng count1 lên 1.

Learning English Everyday