2011-09-09 34 views

Trả lời

10

Nó không phải là "sai", nhưng đáng ngạc nhiên. Một nhiệm vụ đánh giá đối tượng đích. Đó là ý nghĩa của nội trang. Nếu bạn định nghĩa nó khác với lớp của bạn, mọi người có thể trở nên bối rối.

Ví dụ:

int c; 
while((c = getchar()) != EOF) { 
    // ... 
} 

Việc chuyển nhượng để c trở c chính nó và so sánh nó với EOF sau đó. Người dùng mong đợi lớp học item của bạn hoạt động tương tự.

5

Chữ ký với khoảng trống sẽ không cho phép tập xích:

a = b = c; 

(. Nhìn vào Johannes' câu trả lời cho một ví dụ nữa của một mô hình sử dụng dựa trên phân công trở về giá trị giao)

Đó là lý do tại sao sử dụng chữ ký như vậy không được khuyến khích. Tuy nhiên, nếu tôi không nhầm, bạn thực sự có thể sử dụng chữ ký đó.

+0

và quan trọng đây là những gì được xây dựng trong các loại –

2

Hoàn toàn hợp pháp. Nhưng khi bạn khai báo operator= như vậy, bạn sẽ không thể thực hiện "chuỗi chuyển nhượng":

item a(X); 
item b; 
item c; 
c = b = a; 

Tham chiếu cho phép sửa đổi giá trị trả lại. Vì operator= được đánh giá từ phải sang trái, mức sử dụng tôi đã hiển thị cho bạn đang hoạt động.

EDIT Ngoài ra, như những người khác đã đề cập, giá trị trả về thường được sử dụng trong các biểu thức như while (a = cin.get()) != 'q'). Nhưng bạn cũng có thể khai báo toán tử như A operator=(const A&) (trả về bản sao) hoặc const A& operator(const A&) (trả về tham chiếu const). Quan điểm của tôi là: toán tử này có thể trả về mọi thứ, nhưng cách thành ngữ là trả về tham chiếu không const cho chính nó.

+1

Không chỉ vậy, khai báo 'toán tử =' như trả về 'void' bạn sẽ không thể sử dụng kết quả của nhiệm vụ vào bất kỳ biểu thức nào. –

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