2012-04-09 52 views
6

thể trùng lặp:
Operator overloadingC++ toán tử == quá tải

sự khác biệt giữa các cách sau đây để quá tải toán tử == là gì?

// stroustrup way 
friend bool operator== (MyClass &lhs, MyClass &rhs); 

// as taught in other places, including caltech 
bool MyClass::operator== (MyClass &rhs); 

Mà cách nào tốt hơn?

+3

Bạn có thể tìm câu trả lời cho câu hỏi này và nhiều hơn nữa trong câu hỏi thường gặp về [toán tử quá tải] (http://stackoverflow.com/questions/4421706/operator-overloading) :) –

+0

Câu hỏi thường gặp cho biết "Toán tử so sánh nhị phân nhị phân nên, theo các quy tắc của ngón tay cái, được thực hiện như các chức năng không phải thành viên "nhưng nó không biện minh cho lý do tại sao quy tắc này tồn tại - http://stackoverflow.com/questions/4421706/operator-overloading/4421719#4421719 – danio

Trả lời

1

này:

friend bool operator== (MyClass &lhs, MyClass &rhs); 

là một chức năng, trong đó so sánh hai đối tượng.

này:

bool MyClass::operator== (MyClass &rhs); 

là một hàm thành viên.

Bạn nên sử dụng loại được đề xuất theo tiêu chuẩn mã hóa của mình hoặc sử dụng tiêu chuẩn mã hóa bạn muốn. Không có gì tốt hơn. Một số người (bao gồm cả bản thân mình) muốn có toán tử so sánh như một hàm, người khác thích nó như là một hàm thành viên.

Nhân tiện, các tham số phải thuộc loại const MyClass &.

2

Đầu tiên là các hàm bạn bè bên ngoài (chức năng miễn phí)

friend bool operator== (MyClass &lhs, MyClass &rhs); 

Thứ hai là hàm thành viên

bool MyClass::operator== (MyClass &rhs); 

Bạn nên sử dụng biến thể thứ hai luôn thì bạn có thể

Bạn nên sử dụng biến thể đầu tiên trong trường hợp: 1) Đối số đầu tiên là lớp bên ngoài (thư viện)

friend ostream& operator<< (ostream &out, MyClass &m) 

2) logic điều hành của không liên quan đến lớp học của bạn và phải được thực hiện riêng rẽ

friend bool operator(const MyClass& my, const std::string& string_form) 

(vì lớp học của bạn không thể biết tất cả về các lớp học có thể cần trong so sánh điều hành)

+0

-1 : xin lỗi, nhưng biến thể đầu tiên thường được ưa thích như được giải thích trong câu trả lời của tôi. –

3
// stroustrup way 
friend bool operator== (MyClass &lhs, MyClass &rhs); 

Đối số phải là const - friend bool operator==(const MyClass& lhs, const MyClass& rhs);. Điều này được ưu tiên vì nó hoạt động khi đối số đầu tiên có thể được xây dựng ngầm. Ví dụ: nếu std::string chỉ có chức năng thành viên operator== thì "abc" == my_std_string sẽ không gọi hàm đó! Tuy nhiên, hàm không phải thành viên có thể được gọi bằng cách ngầm xây dựng chuỗi từ "abc" (tốt hơn trong trường hợp cụ thể này, có thể cung cấp bool operator==(const char*, const std::string&) riêng biệt vì lý do hiệu suất, nhưng điểm vẫn đứng - chức năng không phải thành viên có thể giúp đảm bảo toán tử hoạt động với kiểu do người dùng định nghĩa ở hai bên).

Một cách riêng biệt, các nhà thầu tiềm ẩn có một chút nguy hiểm - và bạn muốn suy nghĩ kỹ về sự thuận tiện so với nguy cơ sử dụng chúng.