Phiên bản không phải thành viên (bạn bè hoặc người khác) được ưu tiên vì nó có thể hỗ trợ chuyển đổi ngầm ở cả bên trái và bên phải của toán tử.
Cho một loại đó là mặc nhiên chuyển đổi cho đối tượng:
struct Widget
{
operator Object() const;
};
Chỉ có phiên bản không phải thành viên có thể được gọi nếu một thể hiện của Widget
xuất hiện ở bên trái:
Widget w;
Object o;
o + w; // can call Object::operator+(Object &) since left-hand side is Object
w + o; // can only call operator+(Object &, Object &)
Để trả lời nhận xét của bạn:
Bằng cách xác định chuyển đổi op erator trong Widget
, chúng tôi thông báo cho trình biên dịch rằng các phiên bản Widget
có thể được tự động chuyển đổi thành các phiên bản Object
.
Widget w;
Object o = w; // conversion
Trong biểu o + w
, trình biên dịch gọi Object::operator+(Object &)
với một cuộc tranh cãi được tạo ra bằng cách chuyển đổi w
một Object
. Vì vậy, kết quả là giống như viết o + w.operator Object()
.
Nhưng trong biểu thức w + o
, trình biên dịch tìm kiếm Widget::operator+
(không tồn tại) hoặc không phải là thành viên operator+(Widget, Object)
. Sau này có thể được gọi bằng cách chuyển đổi w
thành một số Object
như trên.
Nguồn
2012-10-07 01:03:28
Có lẽ tốt hơn để trích dẫn các bit có liên quan từ câu hỏi cuối cùng, vì vậy mọi người không phải nhấp qua nó (và cũng có thể trong trường hợp câu hỏi biến mất) – nneonneo