Một lý do nữa trong ví dụ của bạn - nó phải là một friend
vì đó là cách duy nhất để xác định một hàm miễn phí bên trong định nghĩa lớp. Nếu bạn muốn có một chức năng không phải là bạn bè, nó sẽ phải được định nghĩa bên ngoài lớp.
Tại sao bạn muốn xác định nó trong lớp học? Đôi khi nó là tốt đẹp để xác định tất cả các nhà khai thác với nhau:
struct SomeClass {
// blah blah blah
SomeClass &operator+=(const SomeClass &rhs) {
// do something
}
friend SomeClass operator+(SomeClass lhs, const SomeClass &rhs) {
lhs += rhs;
return lhs;
}
// blah blah blah
// several pages later
};
có thể thêm một chút thân thiện hơn:
struct SomeClass {
// blah blah blah
SomeClass &operator+=(const SomeClass &rhs) {
// do something
}
// blah blah blah
// several pages later
};
SomeClass operator+(SomeClass lhs, const SomeClass &rhs) {
lhs += rhs;
return lhs;
}
này giả định tất nhiên mà bạn đang định chức năng thành viên có liên quan trong định nghĩa lớp , thay vì tuyên bố chúng ở đó và định nghĩa chúng trong tệp .cpp.
Chỉnh sửa: Tôi đã sử dụng + = và + làm ví dụ mà không thực sự nghĩ về nó, nhưng câu hỏi của bạn là về operator<<
, không có bất kỳ nhà khai thác liên quan chặt chẽ nào như operator+
. Nhưng nếu operator<<
gọi một hoặc nhiều chức năng thành viên liên quan đến in, bạn có thể muốn xác định nó gần nơi chúng được xác định.
Nguồn
2010-03-17 04:36:51
Bạn có thực sự cần bất kỳ lý do nào khác không? –
@mmyers: Tôi chỉ cố gắng hiểu nó rõ ràng như tôi có thể. – skydoor
Nó rõ ràng không thể là một chức năng thành viên (xem câu trả lời của Charles Bailey), nhưng nó không phải là một người bạn * * - nếu bạn có thể thực hiện nó dưới dạng giao diện công khai của lớp, điều đó sẽ siêu. – UncleBens