Saturday, May 2, 2015

Overloading (quá tải hặc nạp chồng)  là cách mà chương trình implement lại hàm hay toán tử theo nhiều dạng thức khác nhau. Có hai loại quá tải là function overloading (quá tải hàm) và operator overloading (quá tải toán tử)

1. Function overloading

Implement nhiều function member có cùng tên nhưng khác đối số đưa vào
Ex:
function-overloading.cpp 

 #include <iostream>  
 using namespace std;  
    
 class printData   
 {  
   public:  
    void print(int i) {  
     cout << "Printing int: " << i << endl;  
    }  
   
    void print(double f) {  
     cout << "Printing float: " << f << endl;  
    }  
   
    void print(char* c) {  
     cout << "Printing character: " << c << endl;  
    }  
 };  
   
 int main(void)  
 {  
   printData pd;  
    
   // Call print to print integer  
   pd.print(5);  
   // Call print to print float  
   pd.print(500.263);  
   // Call print to print character  
   pd.print("Hello C++");  
    
   return 0;  
 }  

Compile & Execute:
 Printing int: 5  
 Printing float: 500.263  
 Printing character: Hello C++  

2. Operator overloading
Nhắc lại một số khái niệm:
Cho biểu thức: c = a + b
Trong đó:
a, b, c gọi là toán hạng
= và + gọi là toán tử 

Có nhiều cách để phân loại toán tử, nếu dự vào số lượng toán hạng thì các toán tử trong C++ được chia thành 2 dạng sau:

+ Toán tử đơn: Có 1 toán hạng
    - Dạng tiền tố (prifix): ++, --, !, &, …
    - Dạng hậu tố (postfix): ++, --, …
+Toán tử đôi: Có 2 toán hạng (+, -, *, /, ...)

Nếu phân loại toán tử dựa vào chức năng thì các toán tử trong C++ được chia thành các loại sau:

+ Toán tử gán: =
+ Các toán tử số học: +, -, *, /, %
+ Các toán tử gán phức hợp: +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=
+ Các toán tử tăng/ giảm: ++, --
+ Các toán tử quan hệ: ==, !=, >, =, <=
+ Các toán tử logic: !, &&, ¦¦
+ Toán tử điều kiện: ?
+ Các toán tử thao tác bit: &, |, ^, ~, <>
+ Các toán tử ép kiểu: (int), (float), ...
+ Một số toán tử khác: (), [ ], ->, ...
C++ cho phép lập trình viên quá tải toán tử cho kiểu dữ liệu tự định nghĩa, tuy nhiên không phải toán tử nào cũng được phép quá tải. C++ chỉ cho quá tải các toán tử sau:
+ , - , * , / , %  , += , -= , *= , /= > , >= , < , <= , == , != && , ¦¦ , ++ , -- , -> , () , [] new , new[] , delete , delete[]
Đối với các toán tử . , .*, :: , :? , typeid , sizeof, C++ không cho phép quá tải các toán tử này.

Cú pháp khai báo và định nghĩa 1 toán tử:

 KDL_TraVe operator@(Danh_Sach_Doi_So)   
  {   
  //Thân hàm   
  }  

Với @ là toán tử cần được quá tải
Danh sách đối số phụ thuộc vào toán tử @ là toán tử đơn hay đôi và toán tử được khai báo dưới dạng là 1 hàm toàn cục (friend function) hay là 1 phương thức của lớp.
Dạng
Phương thức của lớp
Hàm toàn cục
A@B
operator@(B)operator@(A, B)
@A
operator@()operator@(A)
A@
operator@(int)operator@(A, int)
Một số chú ý khi quá tải toán tử:
  • Khi phép toán có toán hạng thứ 1 là 1 đối tượng thuộc lớp thì có thể dùng phương thức của lớp hoặc hàm toàn cục.
  • Nếu toán hạng thứ 1 không phải là đối tượng thuộc lớp thì ta phải dùng hàm toàn cục.
  • Các toán tử = , [] , () , -> bắt buộc phải khai báo là phương thức của lớp.
Xem chi tiết tại đây.

Leave a Reply

Subscribe to Posts | Subscribe to Comments

- Copyright © Lập trình hệ thống nhúng Linux . Powered by Luong Duy Ninh -