Nạp chồng C ++ (Toán tử và Hàm)
C ++ cho phép bạn chỉ định nhiều hơn một định nghĩa cho một function tên hoặc một operator trong cùng một phạm vi, được gọi là function overloading và operator overloading tương ứng.
Khai báo quá tải là một khai báo được khai báo trùng tên với một khai báo đã khai báo trước đó trong cùng một phạm vi, ngoại trừ việc cả hai khai báo có các đối số khác nhau và rõ ràng là khác nhau về định nghĩa (thực thi).
Khi bạn gọi một quá tải function hoặc là operator, trình biên dịch xác định định nghĩa thích hợp nhất để sử dụng, bằng cách so sánh các kiểu đối số mà bạn đã sử dụng để gọi hàm hoặc toán tử với các kiểu tham số được chỉ định trong định nghĩa. Quá trình chọn hàm hoặc toán tử được nạp chồng thích hợp nhất được gọi làoverload resolution.
Nạp chồng hàm trong C ++
Bạn có thể có nhiều định nghĩa cho cùng một tên hàm trong cùng một phạm vi. Định nghĩa của hàm phải khác nhau theo kiểu và / hoặc số lượng đối số trong danh sách đối số. Bạn không thể nạp chồng các khai báo hàm chỉ khác nhau theo kiểu trả về.
Sau đây là ví dụ trong đó cùng một chức năng print() đang được sử dụng để in các kiểu dữ liệu khác nhau -
#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;
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Printing int: 5
Printing float: 500.263
Printing character: Hello C++
Nạp chồng toán tử trong C ++
Bạn có thể xác định lại hoặc nạp chồng cho hầu hết các toán tử tích hợp sẵn trong C ++. Do đó, một lập trình viên cũng có thể sử dụng các toán tử với các kiểu do người dùng xác định.
Toán tử được nạp chồng là các hàm có tên đặc biệt: từ khóa "toán tử" theo sau là ký hiệu cho toán tử đang được định nghĩa. Giống như bất kỳ hàm nào khác, toán tử được nạp chồng có kiểu trả về và danh sách tham số.
Box operator+(const Box&);
khai báo toán tử bổ sung có thể được sử dụng để addhai đối tượng Box và trả về đối tượng Box cuối cùng. Hầu hết các toán tử được nạp chồng có thể được định nghĩa là các hàm không phải thành viên thông thường hoặc như các hàm thành viên của lớp. Trong trường hợp chúng ta định nghĩa hàm trên là hàm không phải thành viên của một lớp thì chúng ta sẽ phải chuyển hai đối số cho mỗi toán hạng như sau:
Box operator+(const Box&, const Box&);
Dưới đây là ví dụ để hiển thị khái niệm toán tử tải quá mức bằng cách sử dụng một hàm thành viên. Ở đây, một đối tượng được truyền dưới dạng một đối số mà các thuộc tính sẽ được truy cập bằng cách sử dụng đối tượng này, đối tượng sẽ gọi toán tử này có thể được truy cập bằng cách sử dụngthis toán tử như được giải thích bên dưới -
#include <iostream>
using namespace std;
class Box {
public:
double getVolume(void) {
return length * breadth * height;
}
void setLength( double len ) {
length = len;
}
void setBreadth( double bre ) {
breadth = bre;
}
void setHeight( double hei ) {
height = hei;
}
// Overload + operator to add two Box objects.
Box operator+(const Box& b) {
Box box;
box.length = this->length + b.length;
box.breadth = this->breadth + b.breadth;
box.height = this->height + b.height;
return box;
}
private:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
};
// Main function for the program
int main() {
Box Box1; // Declare Box1 of type Box
Box Box2; // Declare Box2 of type Box
Box Box3; // Declare Box3 of type Box
double volume = 0.0; // Store the volume of a box here
// box 1 specification
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// box 2 specification
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// volume of box 1
volume = Box1.getVolume();
cout << "Volume of Box1 : " << volume <<endl;
// volume of box 2
volume = Box2.getVolume();
cout << "Volume of Box2 : " << volume <<endl;
// Add two object as follows:
Box3 = Box1 + Box2;
// volume of box 3
volume = Box3.getVolume();
cout << "Volume of Box3 : " << volume <<endl;
return 0;
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400
Có thể quá tải / Không thể quá tải
Sau đây là danh sách các toán tử có thể được nạp chồng:
+ | - | * | / | % | ^ |
& | | | ~ | ! | , | = |
< | > | <= | > = | ++ | - |
<< | >> | == | ! = | && | || |
+ = | - = | / = | % = | ^ = | & = |
| = | * = | << = | >> = | [] | () |
-> | -> * | Mới | Mới [] | xóa bỏ | xóa bỏ [] |
Sau đây là danh sách các toán tử, không thể được nạp chồng:
:: | . * | . | ?: |
Ví dụ về quá tải của nhà điều hành
Dưới đây là các ví dụ về nạp chồng toán tử khác nhau để giúp bạn hiểu khái niệm.
Sr.No | Toán tử & Ví dụ |
---|---|
1 | Quá tải các nhà khai thác đơn lẻ |
2 | Quá tải toán tử nhị phân |
3 | Quá tải các toán tử quan hệ |
4 | Quá tải toán tử đầu vào / đầu ra |
5 | ++ và - Quá tải toán tử |
6 | Quá tải người điều hành nhiệm vụ |
7 | Cuộc gọi hàm () Quá tải toán tử |
số 8 | Đăng ký [] Người vận hành quá tải |
9 | Toán tử Quyền truy cập Thành viên Lớp -> Quá tải |