Quá Tải Trong C++ (Overloading in C++)

Quá Tải Trong C++ (Overloading in C++)

Lê Anh Đức đã đăng
Hiện có lượt xem và 0 bình luận

Quá Tải (Overloading)

  • Quá tải trong C++ có 2 dạng:
    • Dùng nhiều hàm có cùng một tên nhưng có đối số khác nhau, gọi là quá tải hàm!
    • Dùng các cài đặt của riêng lớp cho các toán tử, ví dụ như +, -, ++,... Gọi là quá tải toán tử!
  • Hai khả năng của quá tải đều rất mạnh, nhưng để sử dụng chúng một cách hiệu quả đòi hỏi người lập trình phải thận trọng!
  • C++ cho phép tạp ra các hàm có tên trùng nhau nhưng khác nhau ở các đối số. Điều này gọi là quá tải hàm (function overloading).
  • Ví dụ:
    • int abs(int i);
    • long abs(long i);
    • double abs(double d);
    • int Tong(int a, int b);
    • int Tong(int a, int b, int c);
    • long Tong(long a, long b);
  • Chú ý:
    • Không thể viết quá tải hàm có giá trị trả về khác nhau và các đối số giống nhau. Ví dụ khai báo sau sẽ bị thông báo lỗi khi biên dịch:
      • int Tong(int a, int b);
      • long Tong(int a, int b);
    • Cần đảm bảo kiểu của các đối số là khác nhau thực sự. Kiểu định nghĩa bởi typedef chỉ là một bí danh của một kiểu đã có, vì vậy đoạn chương trình sau sẽ bị lỗi:
      • typedef int Songuyen;
        int Tang(int a);
        int Tang(Songuyen a);
        ...

Quá tải phương thức

  • Các phương thức của lớp cũng có thể được quá tải theo cách của quá tải hàm
  • Đối tượng sẽ tự động lựa chọn phương thức thích hợp vào lúc gọi
  • Ví dụ: Lớp Phanso có 2 phương thức cộng
    • //Cộng một phân số với một phân số
      Phanso Cong(Phanso ps);
      //Cộng một phân số với một số nguyên
      Phanso Cong(int n);
  • Đặc biệt, nên quá tải các cấu tử của lớp để cung cấp nhiều cách khởi tạo đa dạng

Quá tải toán tử

  • Với mỗi kiểu dữ liệu được xây dựng sẵn như int, float, char…, ta có các toán tử thao tác trên đó như ++, +, -, …
  • Với các lớp, ta vẫn thường xây dựng phương thức để thực hiện các thao tác trên đó. Ví dụ:
    • Lớp Phanso có phương thức Cong
    • Để cộng 2 phân số, ta dùng:
      • z = x.Cong(y); //cách viết này không “tự nhiên” !
  • C++ cho phép xây dựng các lớp trong đó có thể định nghĩa lại thao tác của các toán tử. Điều này gọi là quá tải toán tử (operator overloading).
  • Các toán tử có thể quá tải là:
    • ++, --, +, -, *, /, +=, -=, *=, /=, <, >, <<, …
  • Cú pháp quá tải toán tử: kiểu_trả_về operator op(đối_số)
    • kiểu_trả_về: Là kiểu dữ liệu cơ bản int, float… hoặc một lớp
    • operator: Từ khoá
    • op: Một trong các toán tử có thể quá tải
    • đối số: Danh sách các đối số theo cách dùng toán tử
  • Ví dụ:
    • int operator++(); //Quá tải toán tử ++
    • Phanso operator+(Phanso ps); //Quá tải toán tử +
  • Ta sẽ quá tải toán tử + trong lớp Phanso để thay cho phương thức Cong


    • class Phanso {
      public:
      ...
      Phanso operator+(Phanso ps);
      };
      Phanso operator+(Phanso ps) {
      int kqts = ts*ps.ms + ps.ts*ms;
      int kqms = ms*ps.ms;
      return Phanso(kqts, kqms); //Trả về đối tượng không tên ^^
      }
  • Nguyên lý quá tải toán tử khá đơn giản. Về thực chất toán tử quá tải của lớp có vai trò như một phương thức, nó không hoàn toàn mang ý nghĩa gốc.
  • Không nên lạm dụng khả năng quá tải làm cho chương trình khó hiểu
    • Đảm bảo rằng các phép toán vẫn giữ được mục đích nguyên thuỷ của nó
    • Nên chú thích vào những toán tử quá tải
  • Nên quá tải toán tử = nếu lớp có liên quan đến cấp phát bộ nhớ động.

Giới hạn của quá tải toán tử

  • Một số toán tử không thể quá tải được là:
    • ., .*, ::, ?:, sizeof
  • Không thể thay đổi thứ tự ưu tiên và ngôi của toán tử
    • Toán tử * luôn được ưu tiên hơn toán tử +
    • Toán tử + luôn là 2 ngôi và toán tử ++ luôn là 1 ngôi
  • Không thể tạo ra các kiểu toán tử mới.

HIỆN CÓ 0 BÌNH LUẬN