2010-02-06 36 views
5

Khi các toán tử quá tải, cần phải quá tải> = < = và! =?quá tải nhà điều hành C++

Có vẻ như sẽ rất thông minh khi gọi C++! Operator = for! =,!> Cho toán tử < = và! < cho toán tử> =.

Trường hợp đó có hay cần thiết để quá tải mọi chức năng?

Trả lời

2

Có, nếu bạn muốn tất cả chúng hoạt động theo cách bạn muốn chúng hoạt động.

C++ không ép buộc bất kỳ ngữ nghĩa cụ thể nào trên hầu hết các toán tử quá tải. Điều duy nhất được cố định là cú pháp chung cho toán tử (bao gồm cả đơn nhất hoặc nhị phân và những thứ như ưu tiên và kết hợp). Điều này ngay lập tức có nghĩa là chức năng thực tế mà bạn thực hiện trong quá tải có thể hoàn toàn tùy ý. Nói chung trường hợp có thể không có bất kỳ kết nối có ý nghĩa giữa những gì nhà điều hành == hiện và những gì nhà điều hành != nào. Toán tử == có thể ghi dữ liệu vào một tệp, trong khi toán tử != có thể sắp xếp một mảng.

Trong khi các toán tử quá tải theo kiểu tùy ý như vậy chắc chắn không phải là một thực hành lập trình tốt, ngôn ngữ C++ không thể giả định bất cứ điều gì. Vì vậy, không, nó không thể và sẽ không tự động sử dụng kết hợp ! == thay cho số != hoặc kết hợp ! > thay cho số <=.

+0

Ví dụ của bạn cho '==' và '! =' Là khá giả tạo. Một thực tế hơn sẽ là một lớp đại diện cho một đối tượng SQL, nơi bạn phải đối phó với ngữ nghĩa đặc biệt của 'NULL'. – dan04

2

Không, bạn chỉ cần để quá tải toán tử == và điều hành <, các thư viện chuẩn sẽ chăm sóc phần còn lại :)

(EDIT: xem using namespace std :: rel_ops;)

+0

Đừng nghĩ rằng đây là như vậy ... Nếu đó là sự thật tại sao trang này sẽ đưa ra ví dụ về xác định! = Về ==? http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html –

+0

Cảm ơn bạn đã làm rõ. –

+1

Không, bạn phải xác định rõ ràng từng nhà điều hành. –

0

Có là một vài số shortcuts bạn có thể sử dụng, chẳng hạn như CRTP để có được chúng automaticallyinjected (xem các lớp So sánh khác nhau) vào lớp học của bạn.

+2

Tôi tự hỏi tại sao câu trả lời hiện tại và câu trả lời này đã bị bỏ phiếu. – GManNickG

+0

Hãy đánh tôi, tôi đã từ bỏ lo lắng về đại diện từ lâu, nhưng tôi vẫn thấy những người chơi trò chơi cố gắng gây ảnh hưởng đến câu trả lời. –

+2

Hãy giải thích lý do khi bạn downvote. –

7

Boost operators có thể là những gì bạn đang tìm kiếm. Chúng sẽ lấy được hầu hết các toán tử của bạn dựa trên một vài toán tử cơ bản.

Điều đó C++ không cung cấp điều này tự động có ý nghĩa, vì người ta có thể đưa ra ý nghĩa hoàn toàn khác với < và>, ví dụ (mặc dù thường là ý tưởng tồi).

+1

C++ không cung cấp điều này như std :: rel_ops, nhưng thật khó để sử dụng chính xác và có thể ngắn hơn để chỉ nhập chúng ra thay vào đó (tránh nhầm lẫn). –

0

Có! Chúng là các toán tử khác nhau về mặt kỹ thuật. Trình biên dịch C++ không phải là các công cụ suy luận vốn có, chúng là các trình phân tích cú pháp/trình biên dịch. Họ sẽ chỉ làm nhiều như bạn nói để làm. http://www.parashift.com/c++-faq-lite/operator-overloading.html, http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

+0

Ngoại trừ chúng là động cơ suy luận! Nhìn vào ADL và tìm ra các quy tắc giải quyết quá tải chức năng cho một cơn đau đầu dài tốt. –

+0

Tôi nghi ngờ sẽ có rất nhiều nhà nghiên cứu AI không đồng ý với bạn về định nghĩa kỹ thuật của một công cụ suy luận trong khoa học máy tính. Nhưng có, những gì trình biên dịch hiện đại có thể "tìm ra" là ấn tượng. –

+0

Định nghĩa tôi đang sử dụng: "Công cụ suy luận là một dạng của máy trạng thái hữu hạn bao gồm ba hành động: kết hợp, lựa chọn và thực thi các quy tắc." Các quy tắc chỉ đơn giản là một sự kết hợp của độ phân giải quá tải chức năng và khai báo các chức năng và các loại trong chương trình. Không có lý lẽ nào là nguyên thủy, dĩ nhiên. –

3

Tôi sẽ có một quan điểm thiểu số ở đây. Nếu bạn đã sử dụng boost thì sử dụng các toán tử tăng cường không phải là một giao dịch lớn. Nó có thể là cách chính xác và thử nghiệm để làm mọi thứ nhưng thêm phụ thuộc tăng chỉ dành cho các nhà khai thác là một quá mức cần thiết.

Có thể viết các chương trình phức tạp C++ mà không tăng (mà cá nhân tôi thấy thẩm mỹ khó chịu) và như vậy để Keep It Simple (Stupid), để trả lời câu hỏi OP của, nếu bạn quá tải operator ==, bạn cũng nên quá tải operator !=. Điều này cũng đúng cho <, >, ++ v.v.

+2

Nếu bạn không thích tăng cường, vì bất kỳ lý do gì, điều đó không có nghĩa là bạn không thể sử dụng cùng một kỹ thuật. Câu trả lời của tôi chứa một liên kết đến một tiêu đề duy nhất, khép kín mà tôi đã viết như một ví dụ về cách thực hiện chính xác trong trường hợp này. –

+0

Tôi chỉ trả lời câu hỏi - C++ không tự động gọi 'operator ==' và đảo ngược kết quả khi '! =' Không được xác định. Không tranh cãi rằng có một cách tự động để làm điều đó. –

1

Có cần quá tải bất kỳ toán tử nào bạn muốn sử dụng khi bạn xác định chúng - C++ sẽ không đưa ra quyết định bạn mô tả ở trên; Tuy nhiên, hãy nhớ rằng nếu lý do bạn đang quá tải là sắp xếp lớp của bạn, hơn bạn chỉ cần ghi đè lên các toán tử được sử dụng bởi thường trình sắp xếp. Trong trường hợp thuật toán sắp xếp RTL, bạn chỉ cần ghi đè < và =.

0

Bạn có thể sử dụng quá tải để sử dụng tên do người dùng xác định. Quá tải toán tử có nghĩa là sử dụng cùng một toán tử để thực hiện thao tác trên các mục khác nhau không nằm trong danh mục đó. Chức năng quá tải có nghĩa là sử dụng cùng một tên hàm nhưng các đối số khác nhau, để khắc phục phí trên khi cùng một hàm được gọi trong khi lặp.

0

C++ không, là ngôn ngữ, xác định bất kỳ toán tử nào theo bất kỳ toán tử quá tải nào khác. Chỉ vì bạn có operator+, không có nghĩa là bạn nhận được operator+= miễn phí (không giống như Ruby và Scala). Chỉ vì bạn có nhà điều hành <== không có nghĩa là bạn nhận được <= miễn phí. Chỉ vì bạn có nhà điều hành == không có nghĩa là bạn nhận được miễn phí != (không giống như Ruby và Scala). Chỉ vì bạn có unary operator * (unary) không có nghĩa là bạn nhận được operator -> miễn phí.

std::relops (nếu được nhập chính xác) và cung cấp định nghĩa mặc định và Boost cung cấp một số kết hợp xác định tất cả toán tử so sánh theo số <==.

Các vấn đề liên quan