2016-11-30 17 views
5

Tôi khá mới để lập trình trong C++ vì vậy xin lỗi nếu điều này là ngu ngốc. Tôi đã làm việc thông qua cuốn sách primer C++, và có một cái gì đó tôi chỉ không thể có được đầu của tôi xung quanh. Đi chức năng này ví dụ:Trả lại một đối tượng lớp trong một hàm thành viên có nghĩa là gì?

Sales_data& Sales_data::combine(const Sales_data &rhs) 
{ 
    units_sold += rhs.units_sold; 
    revenue += rhs.revenue; 
    return *this; 
} 

Và chúng tôi gọi là chức năng sử dụng:

total.combine(trans); 

tôi nhận được rằng các đơn vị bán & doanh thu trong tổng số đối tượng sẽ được kết hợp với điều đó trong đối tượng xuyên, làm việc giống như toán tử gán (+ =).

tôi nhận được rằng điều này sẽ trở lại với tổng đối tượng, nhưng tôi không nhận được những gì trả lại tổng số đối tượng có nghĩa là ...

Trả lời

9

Trở bằng cách tham khảo (cho các đối tượng được gọi trên) có nghĩa là bạn có thể chuỗi các cuộc gọi trong một mã dòng; tất cả các cuộc gọi sẽ bị ràng buộc với cùng đối tượng:

total.combine(trans).combine(trans2).combine(trans3); 

tương đương với:

total.combine(trans); 
total.combine(trans2); 
total.combine(trans3); 

(Tất nhiên nó không có nghĩa là bạn phải gọi phương thức tương tự, bạn có thể trộn với . các phương pháp khác với đặc điểm tương tự)

Thành ngữ này thường được sử dụng trong việc triển khai của các nhà khai thác như operator=, operator<<, operator>> vv, mà cũng có thể được gọi với chaining:

a = b = c; 
cout << a << b << c; 
7

Nó trả về tham chiếu cho chính nó, điều này cho phép chuỗi phương pháp. Ví dụ, nói rằng bạn có 2 Sales_data đối tượng và bạn muốn kết hợp cả hai trong số họ, bạn có thể sau đó "chuỗi" các cuộc gọi:

Sales_data s1, s2, total; 
//stuff.. 
total.combine(s1).combine(s2); 

Bởi vì bạn trả về một tham chiếu này cho phép các đối tượng total phải được sửa đổi ở giữa cuộc gọi, đó là lý do tại sao nó được gọi là "chuỗi".

3

Trong ví dụ này, bạn đang quay trở lại tham chiếu đến total, cho phép chúng tôi sử dụng biểu thức total.combine(trans) làm đối tượng đã thay đổi total.

Ví dụ, nếu operator<< bị quá tải cho Sales_data, chúng tôi chỉ đơn giản là có thể kết hợp và in thay đổi tổng như thế này:

std::cout << total.combine(trans); 

hoặc chúng ta có thể phương pháp dây chuyền, nếu chúng ta muốn kết hợp nhiều lần cho cùng một đối tượng, như này:

total.combine(trans).combine(trans1); 

Trong ví dụ này, total được kết hợp, và cùng một đối tượng total được trả lại, và chúng ta có thể kết hợp một lần nữa với đã thay đổi đối tượng.

Đây là mẫu tốt để đơn giản hóa mã, khi bạn cần sử dụng đối tượng đã thay đổi trong cùng một biểu thức.

3

Mẫu trên của bạn sử dụng biểu tượng tham chiếu & sau lớp học.Điều này cho phép bạn trả về một tham chiếu đến đối tượng lớp hiện tại của bạn bằng cách sử dụng * this. Tất cả trở về một phương tiện tham chiếu là bạn đang trả về một con trỏ đến đối tượng của bạn trên ngăn xếp. Điều này là hữu ích cú pháp cho các cuộc gọi chuỗi kết nối.

total.combine(trans).combine(trans2).combine(trans3); 
Các vấn đề liên quan