Hướng dẫn c++ complex number class operator overloading - Nạp chồng toán tử lớp số phức trong C++

Trong ví dụ này, bạn sẽ học cách trừ các số phức tạp bằng cách sử dụng quá tải toán tử của toán tử.

Để hiểu ví dụ này, bạn nên có kiến ​​thức về các chủ đề lập trình C ++ sau:

  • Các lớp và đối tượng C ++
  • Chất xây dựng C ++
  • Quá tải toán tử C ++

Vì - là một toán tử nhị phân (toán tử hoạt động trên hai toán hạng), một trong các toán hạng nên được truyền làm đối số cho chức năng toán tử và quá trình REST tương tự như quá tải các toán tử Unary.


Ví dụ: Toán tử nhị phân quá tải để trừ đi số phức

#include 
using namespace std;

class Complex
{
    private:
      float real;
      float imag;
    public:
       Complex(): real(0), imag(0){ }
       void input()
       {
           cout << "Enter real and imaginary parts respectively: ";
           cin >> real;
           cin >> imag;
       }

       // Operator overloading
       Complex operator - (Complex c2)
       {
           Complex temp;
           temp.real = real - c2.real;
           temp.imag = imag - c2.imag;

           return temp;
       }

       void output()
       {
           if(imag < 0)
               cout << "Output Complex number: "<< real << imag << "i";
           else
               cout << "Output Complex number: " << real << "+" << imag << "i";
       }
};

int main()
{
    Complex c1, c2, result;

    cout<<"Enter first complex number:\n";
    c1.input();

    cout<<"Enter second complex number:\n";
    c2.input();

    // In case of operator overloading of binary operators in C++ programming, 
    // the object on right hand side of operator is always assumed as argument by compiler.
    result = c1 - c2;
    result.output();

    return 0;
}

Trong chương trình này, ba đối tượng thuộc loại phức tạp & nbsp; được tạo và người dùng được yêu cầu nhập các phần thực và tưởng tượng cho hai số phức được lưu trữ trong các đối tượng c1c2.

Sau đó câu lệnh result = c1 -c 2 được thực thi. Câu lệnh này gọi hàm toán tử Complex operator - (Complex c2).

Khi result = c1 - c2 được thực thi, c2 được truyền làm đối số cho chức năng toán tử.

Trong trường hợp quá tải toán tử của các toán tử nhị phân trong lập trình C ++, đối tượng ở phía bên phải của toán tử luôn được coi là đối số của trình biên dịch.

Sau đó, hàm này trả về hàm phức (đối tượng) cho main () được hiển thị trên màn hình.

Mặc dù vậy, hướng dẫn này chứa quá tải - toán tử, toán tử nhị phân trong chương trình C ++ như:+, *,

Trong C ++, chúng ta có thể làm cho các nhà khai thác hoạt động cho các lớp do người dùng xác định. Điều này có nghĩa là C ++ có khả năng cung cấp cho các toán tử một ý nghĩa đặc biệt cho kiểu dữ liệu, khả năng này được gọi là quá tải của toán tử. Ví dụ: chúng ta có thể quá tải một toán tử ‘ +trong một lớp như chuỗi để chúng ta có thể nối hai chuỗi chỉ bằng cách sử dụng +. Các lớp ví dụ khác trong đó các toán tử số học có thể bị quá tải là các số phức, số phân số, số nguyên lớn, v.v.

Quá tải người vận hành là một đa hình thời gian biên dịch. Đó là một ý tưởng đưa ra ý nghĩa đặc biệt cho một nhà điều hành hiện có trong C ++ mà không thay đổi ý nghĩa ban đầu của nó. Ví dụ:
Example:

& nbsp; & nbsp; & nbsp; & nbsp; int a; & nbsp; & nbsp; & nbsp; Float B, sum; & nbsp; & nbsp; & nbsp; sum = a+b;
      float b,sum;
      sum=a+b;

Ở đây, các biến số của một người khác và các loại khác là các loại int int và float float, là các loại dữ liệu tích hợp. Do đó, toán tử bổ sung ‘+, có thể dễ dàng thêm nội dung của A A và và B B. Điều này là do toán tử bổ sung,++được xác định trước để thêm các biến của kiểu dữ liệu tích hợp. & NBSP;
 

Bây giờ, hãy xem xét một ví dụ khác

lớp A {
{

};

int main () {& nbsp; & nbsp; & nbsp; A & nbsp; A1, A2, A3;
{
      A   a1,a2,a3;

& nbsp; & nbsp; & nbsp; A3 = A1 + A2;

& nbsp; & nbsp; & nbsp; trả về 0;}
}

Trong ví dụ này, chúng tôi có 3 biến số A1, A2, A2, và A3, loại của loại lớp A. Ở đây, chúng tôi đang cố gắng thêm hai đối tượng, A1 A1 và A2, một loại thuộc loại do người dùng xác định, tức là loại loại loại A bằng cách sử dụng toán tử++. Điều này không được phép, bởi vì toán tử bổ sung là++được xác định trước để chỉ hoạt động trên các loại dữ liệu tích hợp. Nhưng ở đây, Lớp A, là một loại do người dùng xác định, vì vậy trình biên dịch tạo ra lỗi. Đây là nơi mà khái niệm về toán tử quá tải của người Viking xuất hiện. Thêm hai đối tượng lớp. Điều này được thực hiện bằng cách sử dụng khái niệm toán tử quá tải quá tải. Vì vậy, ý tưởng chính đằng sau quá trình vận hành quá tải của người dùng là sử dụng các toán tử C ++ với các biến lớp hoặc các đối tượng lớp. Xác định lại ý nghĩa của các nhà khai thác thực sự không thay đổi ý nghĩa ban đầu của chúng; Thay vào đó, họ đã được cung cấp thêm ý nghĩa cùng với những ý nghĩa hiện có của họ. Ví dụ đơn giản và hoàn chỉnh & nbsp; & nbsp;
Now, if the user wants to make the operator “+” to add two class objects, the user has to redefine the meaning of the “+” operator such that it adds two class objects. This is done by using the concept “Operator overloading”. So the main idea behind “Operator overloading” is to use c++ operators with class variables or class objects. Redefining the meaning of operators really does not change their original meaning; instead, they have been given additional meaning along with their existing ones.
A simple and complete example 
 

CPP

12 + i9
0

12 + i9
1
12 + i9
2
12 + i9
3

12 + i9
4
12 + i9
5

12 + i9
6
12 + i9
7

12 + i9
8
12 + i9
9
sizeof
typeid
Scope resolution (::)
Class member access operators (.(dot), .* (pointer to member operator))
Ternary or conditional (?:)
0

sizeof
typeid
Scope resolution (::)
Class member access operators (.(dot), .* (pointer to member operator))
Ternary or conditional (?:)
1
12 + i9
7

12 + i9
8
sizeof
typeid
Scope resolution (::)
Class member access operators (.(dot), .* (pointer to member operator))
Ternary or conditional (?:)
4
12 + i9
9
sizeof
typeid
Scope resolution (::)
Class member access operators (.(dot), .* (pointer to member operator))
Ternary or conditional (?:)
6
12 + i9
9
sizeof
typeid
Scope resolution (::)
Class member access operators (.(dot), .* (pointer to member operator))
Ternary or conditional (?:)
8

12 + i9
8
x = 20, y = 20
x = 30, y = 0
0
x = 20, y = 20
x = 30, y = 0
1
x = 20, y = 20
x = 30, y = 0
2

x = 20, y = 20
x = 30, y = 0
3
x = 20, y = 20
x = 30, y = 0
4

x = 20, y = 20
x = 30, y = 0
3
x = 20, y = 20
x = 30, y = 0
6

x = 20, y = 20
x = 30, y = 0
3
x = 20, y = 20
x = 30, y = 0
8

x = 20, y = 20
x = 30, y = 0
3c10 c11

12 + i9
8c13

12 + i9
8c15 c16c17 c18c19c20

c21

12 + i9
9 c23

c24

12 + i9
8c26

12 + i9
8c28

12 + i9
8result = c1 -c 20

c13

Output: 

12 + i9

Sự khác biệt giữa các chức năng toán tử và các chức năng bình thường là gì? & NBSP; Các chức năng toán tử giống như các hàm bình thường. Sự khác biệt duy nhất là, tên của hàm toán tử luôn là từ khóa toán tử theo sau là biểu tượng của các hàm toán tử và các hàm toán tử được gọi khi toán tử tương ứng được sử dụng. & NBSP; sau đây là một ví dụ về chức năng toán tử toàn cầu. & NBSP; 
Operator functions are the same as normal functions. The only differences are, that the name of an operator function is always the operator keyword followed by the symbol of the operator and operator functions are called when the corresponding operator is used. 
Following is an example of a global operator function. 

Chúng ta có thể quá tải tất cả các toán tử không? & NBSP; Hầu như tất cả các toán tử có thể bị quá tải ngoại trừ một số ít. Sau đây là danh sách các toán tử không thể bị quá tải. & NBSP; 
Almost all operators can be overloaded except a few. Following is the list of operators that cannot be overloaded. 

sizeof
typeid
Scope resolution (::)
Class member access operators (.(dot), .* (pointer to member operator))
Ternary or conditional (?:)

Người vận hành có thể bị quá tải

Chúng ta có thể quá tải

  • Các nhà khai thác đơn
  • Nhà khai thác nhị phân
  • Toán tử đặc biệt ([], () vv) & nbsp;
     

Nhưng, trong số đó, có một số nhà khai thác không thể bị quá tải. họ đang

  • Toán tử phân giải phạm vi & NBSP; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;::
  • Nhà điều hành lựa chọn thành viên & NBSP; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;
  • Lựa chọn thành viên thông qua & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; * & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;
     

Con trỏ đến biến thành viên

  • Nhà điều hành có điều kiện & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; ? :
  • Nhà điều hành sizeof & NBSP; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; sizeof () & nbsp;
     

Người vận hành có thể bị quá tải

  1. Số học nhị phân & NBSP; & nbsp; -> & nbsp; & nbsp; +, -, *, /, %
  2. Số học không có số học & nbsp; & nbsp; -> & nbsp; & nbsp; +, -, ++, -
  3. Chuyển nhượng & NBSP; & nbsp; -> & nbsp; & nbsp; =, +=,*=, /=,-=, %=
  4. Toán tử đặc biệt ([], () vv) & nbsp;
  5. Tham chiếu & NBSP; & nbsp; -> & nbsp; & nbsp; (->)
  6. Phân bổ bộ nhớ động và khử phân bổ & NBSP; & nbsp; -> & nbsp; & nbsp; Mới, Xóa & NBSP;
  7. Người đăng ký & NBSP; & nbsp; -> & nbsp; & nbsp; []
  8. Chức năng gọi & nbsp; & nbsp; -> & nbsp; & nbsp; ()
  9. Logic & nbsp; & nbsp; & nbsp;-> & nbsp; & nbsp; &, & nbsp; | |,!
  10. Quan hệ & NBSP; & nbsp; -> & nbsp; & nbsp; >, <, = =, =

Tại sao các nhà khai thác đã nêu ở trên bị quá tải?

1. sizeof - điều này trả về kích thước của đối tượng hoặc kiểu dữ liệu được nhập dưới dạng toán hạng. Điều này được đánh giá bởi trình biên dịch và không thể được đánh giá trong thời gian chạy. Sự gia tăng thích hợp của một con trỏ trong một mảng các đối tượng dựa trên toán tử sizeof một cách ngầm định. Thay đổi ý nghĩa của nó bằng cách sử dụng quá tải sẽ khiến một phần cơ bản của ngôn ngữ sụp đổ.

2. Kiểu mẫu: Điều này cung cấp một chương trình CPP với khả năng khôi phục loại dẫn xuất thực tế của đối tượng được đề cập bởi một con trỏ hoặc tham chiếu. Đối với toán tử này, toàn bộ điểm là xác định duy nhất một loại. Nếu chúng ta muốn tạo một loại do người dùng xác định ‘trông giống như một loại khác, có thể sử dụng đa hình nhưng ý nghĩa của toán tử kiểu chữ phải không bị thay đổi, hoặc nếu không các vấn đề nghiêm trọng có thể phát sinh.

3. Độ phân giải phạm vi (: :): Điều này giúp xác định và chỉ định bối cảnh mà một định danh đề cập đến bằng cách chỉ định một không gian tên. Nó được đánh giá hoàn toàn trong thời gian chạy và hoạt động trên tên thay vì các giá trị. Các toán hạng của độ phân giải phạm vi là các biểu thức ghi chú với các loại dữ liệu và CPP không có cú pháp để chụp chúng nếu nó bị quá tải. Vì vậy, không thể quá tải về mặt cú pháp này.

4. Các toán tử truy cập thành viên lớp (. (DOT),.* (Có thể hiểu được con trỏ tới thành viên)): Tầm quan trọng và sử dụng ngầm của các toán tử truy cập thành viên lớp có thể được hiểu thông qua ví dụ sau:

C++

result = c1 -c 22

12 + i9
1
12 + i9
2
12 + i9
3

12 + i9
4 result = c1 -c 27

result = c1 -c 28

12 + i9
6
12 + i9
7

result = c1 -c 28

12 + i9
9 Complex operator - (Complex c2)3

result = c1 -c 28

12 + i9
9 Complex operator - (Complex c2)6

result = c1 -c 28

sizeof
typeid
Scope resolution (::)
Class member access operators (.(dot), .* (pointer to member operator))
Ternary or conditional (?:)
1
12 + i9
7

result = c1 -c 28result = c1 - c21

12 + i9
9 result = c1 - c23
12 + i9
9 result = c1 - c25

12 + i9
8result = c1 - c27result = c1 - c28

12 + i9
8result = c1 - c27c21

result = c1 -c 28c13

result = c1 -c 28c15 c26

12 + i9
8c28c17
12 + i9
00

result = c1 -c 28c13

result = c1 -c 28

12 + i9
04

12 + i9
8
12 + i9
06

12 + i9
8
12 + i9
08result = c1 - c27
12 + i9
10

12 + i9
8
12 + i9
12result = c1 - c27
12 + i9
14

12 + i9
8c10
12 + i9
17

result = c1 -c 28c13

c21

12 + i9
9
12 + i9
22

12 + i9
8
12 + i9
24

12 + i9
8
12 + i9
26

12 + i9
8
12 + i9
28

12 + i9
8result = c1 -c 20

12 + i9
8c10
12 + i9
33

c13

Câu lệnh ComplexNumber C3 = C1 + C2; được dịch nội bộ là ComplexNumber C3 = C1.Operator+ (C2); Để gọi chức năng toán tử. Đối số C1 được thông qua hoàn toàn bằng cách sử dụng toán tử. Câu lệnh tiếp theo cũng sử dụng toán tử DOT để truy cập vào chức năng thành viên và chuyển C3 làm đối số. Do đó, để đảm bảo một hệ thống tiếp cận các thành viên trong lớp đáng tin cậy và không đáng tin cậy, cơ chế được xác định trước sử dụng các nhà khai thác truy cập thành viên lớp là hoàn toàn cần thiết. Bên cạnh đó, các nhà khai thác này cũng hoạt động trên tên và không phải giá trị và không có điều khoản (về mặt cú pháp) để làm quá tải chúng.

5. Ternary hoặc có điều kiện (? :): Toán tử ternary hoặc có điều kiện là một đại diện tốc ký của một câu lệnh if-else. Trong toán tử, các biểu thức đúng/sai chỉ được đánh giá trên cơ sở giá trị sự thật của biểu thức có điều kiện. & NBSP;

Tuyên bố có điều kiện? Biểu thức1 (nếu câu lệnh là đúng): expression2 (khác)

Một chức năng quá tải toán tử ternary cho một lớp nói rằng ABC bằng cách sử dụng định nghĩa

Toán tử ABC?: (Điều kiện bool, abc trueexpr, abc falseExPR);

sẽ không thể đảm bảo rằng chỉ có một trong các biểu thức được đánh giá. Do đó, toán tử ternary không thể bị quá tải.

Các điểm quan trọng về quá tải toán tử & NBSP; 1) Để quá tải toán tử hoạt động, ít nhất một trong các toán hạng phải là đối tượng lớp do người dùng xác định.2) Trình điều khiển gán: Trình biên dịch tự động tạo toán tử gán mặc định với mỗi lớp. Toán tử gán mặc định thực hiện tất cả các thành viên của phía bên phải sang bên trái và hoạt động tốt trong hầu hết các trường hợp (hành vi này giống như hàm tạo sao chép). Xem điều này để biết thêm chi tiết. 
1) For operator overloading to work, at least one of the operands must be a user-defined class object.
2) Assignment Operator: Compiler automatically creates a default assignment operator with every class. The default assignment operator does assign all members of the right side to the left side and works fine in most cases (this behaviour is the same as the copy constructor). See this for more details. 
3) Conversion Operator: We can also write conversion operators that can be used to convert one type to another type. 
 

CPP

result = c1 -c 22

12 + i9
1
12 + i9
2
12 + i9
3

12 + i9
4
12 + i9
40

c24

12 + i9
6
12 + i9
7

12 + i9
8
12 + i9
9
12 + i9
46

sizeof
typeid
Scope resolution (::)
Class member access operators (.(dot), .* (pointer to member operator))
Ternary or conditional (?:)
1
12 + i9
7

12 + i9
8
12 + i9
50
12 + i9
9
12 + i9
52
12 + i9
9
12 + i9
54

12 + i9
8
12 + i9
56
12 + i9
57
12 + i9
58
x = 20, y = 20
x = 30, y = 0
1 c24

12 + i9
61c10
12 + i9
57
12 + i9
64
12 + i9
57
12 + i9
66

12 + i9
8c13

c21

12 + i9
9
12 + i9
22

12 + i9
8
12 + i9
73

12 + i9
8
12 + i9
57
12 + i9
76

12 + i9
8
12 + i9
78c19
12 + i9
80

12 + i9
8c10
12 + i9
33

c13

Các toán tử chuyển đổi quá tải phải là một phương thức thành viên. Các toán tử khác có thể là phương thức thành viên hoặc phương thức toàn cầu.4) Bất kỳ hàm tạo nào cũng có thể được gọi với một đối số duy nhất hoạt động như một hàm tạo chuyển đổi, có nghĩa là nó cũng có thể được sử dụng để chuyển đổi ẩn cho lớp được xây dựng. & NBSP; & NBSP ;
4) Any constructor that can be called with a single argument works as a conversion constructor, which means it can also be used for implicit conversion to the class being constructed. 
 

CPP

result = c1 -c 22

12 + i9
1
12 + i9
2
12 + i9
3

12 + i9
4
12 + i9
40

c24

12 + i9
6
12 + i9
7

12 + i9
8
12 + i9
9
12 + i9
46

sizeof
typeid
Scope resolution (::)
Class member access operators (.(dot), .* (pointer to member operator))
Ternary or conditional (?:)
1
12 + i9
7

12 + i9
8
12 + i9
50
12 + i9
9
12 + i9
52
12 + i9
9
12 + i9
54

12 + i9
61
sizeof
typeid
Scope resolution (::)
Class member access operators (.(dot), .* (pointer to member operator))
Ternary or conditional (?:)
06

12 + i9
8c13

12 + i9
8
12 + i9
56
12 + i9
57
12 + i9
58
x = 20, y = 20
x = 30, y = 0
1 c24

12 + i9
61c10
12 + i9
57
12 + i9
64
12 + i9
57
12 + i9
66

12 + i9
8c13

c21

12 + i9
9
12 + i9
22

12 + i9
8
sizeof
typeid
Scope resolution (::)
Class member access operators (.(dot), .* (pointer to member operator))
Ternary or conditional (?:)
26

12 + i9
8
12 + i9
73

12 + i9
8
sizeof
typeid
Scope resolution (::)
Class member access operators (.(dot), .* (pointer to member operator))
Ternary or conditional (?:)
30

12 + i9
8
sizeof
typeid
Scope resolution (::)
Class member access operators (.(dot), .* (pointer to member operator))
Ternary or conditional (?:)
28

12 + i9
8c10
12 + i9
33

c13

Các toán tử chuyển đổi quá tải phải là một phương thức thành viên. Các toán tử khác có thể là phương thức thành viên hoặc phương thức toàn cầu.4) Bất kỳ hàm tạo nào cũng có thể được gọi với một đối số duy nhất hoạt động như một hàm tạo chuyển đổi, có nghĩa là nó cũng có thể được sử dụng để chuyển đổi ẩn cho lớp được xây dựng. & NBSP; & NBSP ;

x = 20, y = 20
x = 30, y = 0

12 + i9
4
12 + i9
90
Quiz on Operator Overloading

12 + i9
8
12 + i9
9
12 + i9
96
 
http://en.wikipedia.org/wiki/Operator_overloading
Please write comments if you find anything incorrect, or if you want to share more information about the topic discussed above.
 


Làm thế nào chúng ta có thể thêm hai số phức tạp bằng cách sử dụng quá tải toán tử trong C ++?

Chúng ta sẽ phải làm quá tải toán tử bổ sung (+) để thêm hai số phức. Chúng tôi cũng phải xác định một hàm để trả về số phức trong biểu diễn thích hợp. Vì vậy, nếu đầu vào giống như C1 = 8 - 5i, C2 = 2 + 3i, thì đầu ra sẽ là 10 - 2i.overload the addition (+) operator to add two complex number. We also have to define a function to return complex number in proper representation. So, if the input is like c1 = 8 - 5i, c2 = 2 + 3i, then the output will be 10 - 2i.

Người vận hành quá tải trong C với ví dụ là gì?

Toán tử quá tải trong C ++ Điều này có nghĩa là C ++ có khả năng cung cấp cho các toán tử một ý nghĩa đặc biệt cho một loại dữ liệu, khả năng này được gọi là quá tải toán tử. Ví dụ: chúng ta có thể quá tải một toán tử ' +' trong một lớp như chuỗi để chúng ta có thể nối hai chuỗi chỉ bằng cách sử dụng +.C++ has the ability to provide the operators with a special meaning for a data type, this ability is known as operator overloading. For example, we can overload an operator '+' in a class like String so that we can concatenate two strings by just using +.

Nhà máy hỗ trợ ngôn ngữ C có quá tải không?

Tính năng này có mặt trong hầu hết các ngôn ngữ định hướng đối tượng như C ++ và Java.Nhưng C không hỗ trợ tính năng này không phải vì OOP, mà là vì trình biên dịch không hỗ trợ nó (ngoại trừ bạn có thể sử dụng _Generic).C doesn't support this feature not because of OOP, but rather because the compiler doesn't support it (except you can use _Generic).

Cú pháp của toán tử quá tải cho lớp A là gì?

Cú pháp để quá tải một toán tử là: Biểu tượng toán tử ReturnType (Đối số) {Hoạt động ...}returnType operator symbol (arguments) { Operations... }