2012-06-09 67 views
9

Tôi đã đọc the C++ FAQ. Ở đó tôi đã tìm thấy một điểm trong hướng dẫn sử dụng toán tử quá tải:Tầm quan trọng của toán tử quá tải -() là hàm miễn phí và không phải là hàm thành viên?

Nếu bạn cung cấp toán tử xây dựng, chúng sẽ cho phép quảng bá toán hạng bên trái (ít nhất là trong trường hợp lớp đó có một tham số đơn không được đánh dấu bằng từ khóa rõ ràng). Ví dụ, nếu phân lớp của bạn hỗ trợ khuyến mãi từ int đến Fraction (thông qua ctor không rõ ràng Fraction :: Fraction (int)), và nếu bạn cho phép x - y cho hai đối tượng Fraction, bạn cũng nên cho phép 42 - y. Trong thực tế, điều đó đơn giản có nghĩa là toán tử() của bạn không phải là một hàm thành viên của Phân số. Thông thường bạn sẽ làm cho nó trở thành một người bạn, nếu không có lý do nào khác hơn là ép nó vào công chúng: một phần của lớp, nhưng ngay cả khi nó không phải là một người bạn, nó không phải là một thành viên.

Tại sao tác giả viết rằng toán tử-() không nên là thành viên?

Hậu quả xấu nếu tôi đặt toán tử-() làm hàm thành viên và hậu quả khác là gì?

+0

Lưu ý rằng tiêu đề không đúng: 'toán tử()' không thể được triển khai như một hàm miễn phí. Hầu hết các nhà khai thác có thể, nhưng không phải tất cả. Trích dẫn đề cập đến toán tử 'operator-', chứ không phải 'operator()' –

+0

có thể trùng lặp của [Toán tử << nên được thực hiện như một người bạn hay một hàm thành viên?] (Http://stackoverflow.com/questions/236801/should -operator-be-implement-as-a-friend-or-as-a-thành viên-chức năng) –

Trả lời

16

Đây là Fraction với các nhà điều hành như một hàm thành viên:

class Fraction 
{ 
    Fraction(int){...} 

    Fraction operator -(Fraction const& right) const { ... } 
}; 

Với nó, đây là mã hợp lệ:

Fraction x; 
Fraction y = x - 42; 

và tương đương để x.operator-(Fraction(42)); nhưng đây không phải là:

Fraction z = 42 - x; 

42 không có hàm thành viên operator - trong đó (tất nhiên, nó thậm chí không một lớp).

Tuy nhiên, nếu bạn tuyên bố toán tử của mình là một hàm miễn phí thay vào đó, các hoạt động chuyển đổi sẽ áp dụng cho cả hai đối số của nó. Vì vậy, đây

Fraction z = 42 - x; 

biến thành này

Fraction z = Fraction(42) - x; 

tương đương với operator-(Fraction(42), x).

+0

... bạn có thể vui lòng xây dựng ý nghĩa của chức năng miễn phí ở đây? Bạn có ý định nói chức năng của bạn bè? –

+0

@Abhishek Gupta: Không, tôi muốn nói _free function_. Hàm _free_ là một hàm ở phạm vi không gian tên, đó là đối diện của hàm _member_. –

+0

Ngoài ra xin vui lòng cho tôi biết ý nghĩa của các nhà khai thác xây dựng là gì? –

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