2012-05-04 44 views
6

Tôi đọc C++ Primer, trong chương hoạt động quá tải, tác giả đã đưa ra một ví dụ:Các loại toán tử trả về trong C++ là gì?

// member binary operator: left-hand operand bound to implicit this pointer 
Sales_item& Sales_item::operator+=(const Sales_item&); 
// nonmember binary operator: must declare a parameter for each operand 
Sales_item operator+(const Sales_item&, const Sales_item&); 

sau đó, tác giả giải thích:

Sự khác biệt này phù hợp với các loại trở lại của các nhà khai thác khi được áp dụng cho các loại số học: Bổ sung mang lại giá trị rvalue và phép tính phức hợp trả về một tham chiếu đến toán hạng bên trái.

Tôi không chắc chắn về "compound assignment returns a reference to the left-hand operand". Bất cứ ai có thể xây dựng trên đó, và những thứ liên quan, xin vui lòng?

+0

Tra cứu chuỗi phương pháp. Về cơ bản nó có nghĩa là 'a = b' trả về' a' sao cho 'c = a = b' đánh giá' c = (a = b) 'hoặc' a = b' rồi 'c = a' tất cả trong 1 câu lệnh. – chris

Trả lời

5

Nó có nghĩa là bạn có thể làm một cái gì đó như sau

a = 1; 
(a += 1) += 1; 

và kết quả sẽ là một == 3. Điều này là do rời khỏi cuộc gọi nhất để + = đổi a và sau đó trả về một tham chiếu đến nó. Sau đó, tiếp theo + = hoạt động trên tham chiếu đến a và một lần nữa thêm một số vào nó.

Mặt khác, toán tử + bình thường trả về một kết quả của kết quả, chứ không phải tham chiếu đến một trong các đối số. Điều này có nghĩa là một biểu thức như a + a = 3; là bất hợp pháp.

+1

"' a + = 1 + = 1; '". [Bạn có chắc chắn về điều đó không?] (Http://ideone.com/wK93x) –

+0

@ Robᵩ: Anh ấy chắc chắn chắc chắn về điều đó. Nhưng điều đó không có nghĩa là anh ta đúng. -1 cho câu trả lời sai. – Nawaz

+1

@Nawaz: Tôi tìm thấy downvote một chút khắc nghiệt, vì nó được giải quyết với [chỉ là một cặp ngoặc đơn] (http://ideone.com/hdhf1).Bản chất của sự phân công hợp chất đã bị bắt trong câu trả lời, vì vậy thất bại Davis bởi vì anh ta vấp vào một vấn đề đơn giản (tạo tác của bảng trắng) có vẻ hơi khó khăn. –

2
a = a + b; 

cũng là

a += b; 

tương đương với

a.operator+= (b) 

operator + = hỗ trợ phân công hợp chất:

(a += b) += c; 

tương đương với

a.operator+= (b).operator+= (c); 

Dòng cuối cùng sẽ không thể thực hiện được nếu giá trị được trả về thay vì giá trị.

xem xét như sau:

c = a + b; 

cũng

c = a.operator+ (b); 

viết

a.operator+ (b) = c; 

không có tác dụng vì giá trị của một là không thay đổi được.

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