2013-03-08 41 views
14

Tôi chỉ mới bắt đầu C++. Tôi hơi bối rối về kiểu trả về của toán tử gán và dereference. Tôi đang theo cuốn sách C++ Primer. Trong những dịp khác nhau, tác giả nói rằng kiểu trả về của toán tử gán là tham chiếu đến kiểu toán hạng bên trái nhưng sau đó, ông ta nói rằng kiểu trả về là kiểu toán hạng bên trái. Tôi đã giới thiệu C++ 11 Standard Sec. 5.17, trong đó kiểu trả về được mô tả là "giá trị lvalue đề cập đến toán hạng bên trái".loại trả về của toán tử gán là gì?

Tương tự, tôi không thể tìm ra liệu dereference trả về đối tượng đã trỏ hoặc tham chiếu đến đối tượng hay không.

Các báo cáo này có tương đương không? Nếu có thì làm sao? Mọi lời giải thích sẽ được đánh giá cao.

+1

Plz mọi người đều lưu ý. cảm ơn cho tất cả các câu trả lời nhưng tôi không có nghĩa là để hỏi về quá tải nhà điều hành. Tôi chưa có, tôi chỉ hỏi về hoạt động chuyển nhượng được xây dựng bằng ngôn ngữ. – rahul1210

Trả lời

18

Chuẩn xác định đúng kiểu trả về của toán tử gán. Trên thực tế, bản thân hoạt động gán không phụ thuộc vào giá trị trả về - đó là lý do tại sao loại trả lại không đơn giản để hiểu.

Kiểu trả về rất quan trọng đối với các hoạt động chuỗi. Hãy xem xét việc xây dựng sau đây: a = b = c;. Giá trị này phải bằng a = (b = c), tức là c phải được gán vào bb thành a. Viết lại số này là a.operator=(b.operator=(c)). Để chuyển nhượng thành a để hoạt động chính xác, kiểu trả về b.operator=(c) phải được tham chiếu đến kết quả gán bên trong (nó sẽ hoạt động với bản sao quá nhưng đó chỉ là chi phí không cần thiết).

Loại điều khiển trả về tùy thuộc vào logic bên trong của bạn, xác định nó theo cách phù hợp với nhu cầu của bạn.

+1

"Tiêu chuẩn xác định chính xác kiểu trả về của toán tử gán" - làm thế nào? –

+7

@LuchianGrigore như OP đã trích dẫn: * C++ 11 Standard Sec. 5.17, trong đó kiểu trả về được mô tả là "lvalue đề cập đến toán hạng bên trái". * – SomeWittyUsername

+7

Nhận xét cuối cùng này hữu ích hơn toàn bộ câu trả lời. –

5

Cả hai đều có thể được bất cứ điều gì, nhưng thườngoperator = lợi nhuận đối tượng hiện tại bằng cách tham chiếu, tức là

A& A::operator = (...) 
{ 
    return *this; 
} 

Và vâng, "ám chỉ đến loại toán hạng tay trái" và "giá trị trái ám chỉ đến tay trái operand "có nghĩa là cùng một điều.

Toán tử dereference có thể có bất kỳ kiểu trả về cơ bản nào. Nó chủ yếu phụ thuộc vào logic của chương trình, bởi vì bạn đang quá tải toán tử áp dụng cho một đối tượng, không phải là một con trỏ tới đối tượng. Thông thường, điều này được sử dụng cho con trỏ thông minh, hoặc vòng lặp, và trả lại đối tượng họ quấn xung quanh:

+0

Bạn có thể mở rộng trên "giá trị tham chiếu đến toán hạng bên trái" có nghĩa là "tham chiếu đến loại toán hạng bên trái". Là tham chiếu một lvalue? – rahul1210

+0

@ user2148032 có, tham chiếu là một giá trị. Toán hạng bên trái là chính đối tượng (vì 'x = y' có toán hạng bên trái' x'). –

+0

cảm ơn tôi nghĩ rằng tôi đã nhận nó – rahul1210

1

Tôi đã thấy vấn đề tương tự, nhưng tôi đoán nó sẽ là tốt nhất để sử dụng

X& X::operator=(const X&); 

Sử dụng điều này, bạn sẽ có thể tái sử dụng các đối tượng trong một chuỗi phân công.