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ử. Show
Để 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:
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
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 Sau đó câu lệnh Khi 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ụ: & nbsp; & nbsp; & nbsp; & nbsp; int a; & nbsp; & nbsp; & nbsp; Float B, sum; & nbsp; & nbsp; & nbsp; 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; & 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; CPP12 + i90 12 + i91 12 + i92 12 + i93 12 + i94 12 + i95 12 + i96 12 + i97 12 + i98 12 + i99 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 + i97 12 + i98 sizeof typeid Scope resolution (::) Class member access operators (.(dot), .* (pointer to member operator)) Ternary or conditional (?:)4 12 + i99 sizeof typeid Scope resolution (::) Class member access operators (.(dot), .* (pointer to member operator)) Ternary or conditional (?:)6 12 + i99 sizeof typeid Scope resolution (::) Class member access operators (.(dot), .* (pointer to member operator)) Ternary or conditional (?:)8 12 + i98 x = 20, y = 20 x = 30, y = 00 x = 20, y = 20 x = 30, y = 01 x = 20, y = 20 x = 30, y = 02 x = 20, y = 20 x = 30, y = 03 x = 20, y = 20 x = 30, y = 04 x = 20, y = 20 x = 30, y = 03 x = 20, y = 20 x = 30, y = 06 x = 20, y = 20 x = 30, y = 03 x = 20, y = 20 x = 30, y = 08 x = 20, y = 20 x = 30, y = 03 c1 0 c1 112 + i98 c1 312 + i98 c1 5 c1 6c1 7 c1 8c1 9c2 0
12 + i99 c2 3
12 + i98 c2 612 + i98 c2 812 + i98 result = c1 -c 2 0
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; 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; 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ảiChúng ta có thể quá tải
Nhưng, trong số đó, có một số nhà khai thác không thể bị quá tải. họ đang
Con trỏ đến biến thành viên
Người vận hành có thể bị quá tải
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++
12 + i91 12 + i92 12 + i93 12 + i94 result = c1 -c 2 7
12 + i96 12 + i97
12 + i99 Complex operator - (Complex c2) 3
12 + i99 Complex operator - (Complex c2) 6
sizeof typeid Scope resolution (::) Class member access operators (.(dot), .* (pointer to member operator)) Ternary or conditional (?:)1 12 + i97
12 + i99 result = c1 - c2 312 + i99 result = c1 - c2 512 + i98 result = c1 - c2 7result = c1 - c2 812 + i98 result = c1 - c2 7c2 1
12 + i98 c2 8c1 712 + i900
12 + i904 12 + i98 12 + i906 12 + i98 12 + i908 result = c1 - c2 712 + i910 12 + i98 12 + i912 result = c1 - c2 712 + i914 12 + i98 c1 0 12 + i917
12 + i99 12 + i922 12 + i98 12 + i924 12 + i98 12 + i926 12 + i98 12 + i928 12 + i98 result = c1 -c 2 012 + i98 c1 0 12 + i933
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. CPP
12 + i91 12 + i92 12 + i93 12 + i94 12 + i940
12 + i96 12 + i97 12 + i98 12 + i99 12 + i946 sizeof typeid Scope resolution (::) Class member access operators (.(dot), .* (pointer to member operator)) Ternary or conditional (?:)1 12 + i97 12 + i98 12 + i950 12 + i99 12 + i952 12 + i99 12 + i954 12 + i98 12 + i956 12 + i957 12 + i958 x = 20, y = 20 x = 30, y = 01 c2 412 + i961 c1 0 12 + i957 12 + i964 12 + i957 12 + i966 12 + i98 c1 3
12 + i99 12 + i922 12 + i98 12 + i973 12 + i98 12 + i957 12 + i976 12 + i98 12 + i978 c1 912 + i980 12 + i98 c1 0 12 + i933
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 ; CPP
12 + i91 12 + i92 12 + i93 12 + i94 12 + i940
12 + i96 12 + i97 12 + i98 12 + i99 12 + i946 sizeof typeid Scope resolution (::) Class member access operators (.(dot), .* (pointer to member operator)) Ternary or conditional (?:)1 12 + i97 12 + i98 12 + i950 12 + i99 12 + i952 12 + i99 12 + i954 12 + i961 sizeof typeid Scope resolution (::) Class member access operators (.(dot), .* (pointer to member operator)) Ternary or conditional (?:)06 12 + i98 c1 312 + i98 12 + i956 12 + i957 12 + i958 x = 20, y = 20 x = 30, y = 01 c2 412 + i961 c1 0 12 + i957 12 + i964 12 + i957 12 + i966 12 + i98 c1 3
12 + i99 12 + i922 12 + i98 sizeof typeid Scope resolution (::) Class member access operators (.(dot), .* (pointer to member operator)) Ternary or conditional (?:)26 12 + i98 12 + i973 12 + i98 sizeof typeid Scope resolution (::) Class member access operators (.(dot), .* (pointer to member operator)) Ternary or conditional (?:)30 12 + i98 sizeof typeid Scope resolution (::) Class member access operators (.(dot), .* (pointer to member operator)) Ternary or conditional (?:)28 12 + i98 c1 0 12 + i933
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 + i94 12 + i990 Quiz on Operator Overloading
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... } |