- Back to Home »
- CPP »
- C++ Overloading
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.