2016-04-12 28 views
6

Có rất nhiều mã để giải thích trên internet (cũng đặc biệt ở đây, trên stackoverflow) trả về *this.Tại sao một số phương thức lớp trả về "* this" (tham chiếu đối tượng của tự)?

Ví dụ từ bài Copy constructor and = operator overload in C++: is a common function possible?:

MyClass& MyClass::operator=(const MyClass& other) 
{ 
    MyClass tmp(other); 
    swap(tmp); 
    return *this; 
} 

Khi tôi viết trao đổi như sau:

void MyClass::swap(MyClass &tmp) 
{ 
    // some code modifying *this i.e. copying some array of tmp into array of *this 
} 

Không phải là đủ giá trị trả về thiết lập của operator =-void và tránh trở *this?

+0

Bạn nghĩ rằng các phép gán chuỗi như 'a = b = c' hoạt động như thế nào? –

+2

hành vi "bình thường" của 'toán tử =' là trả về tham chiếu đến kết quả của phép toán. Bạn có thể định nghĩa nó là vô hiệu nhưng nó hoạt động khác với mọi mong đợi của người dùng. Bạn đơn giản không thể viết một cái gì đó như '(x = y) ++' hoặc bất kỳ đánh giá nào khác sử dụng giá trị kết quả. Điều quan trọng là bạn trả lại tham chiếu đến đối tượng không chỉ giá trị. Nếu bạn chỉ trả về giá trị, thuật ngữ trên sẽ biên dịch nhưng kết quả là sai! – Klaus

+0

Điều này được gọi là [Phương pháp Chaining] (https://en.wikipedia.org/wiki/Method_chaining#C.2B.2B). Liên quan: ['Trở lại * cái này' có nghĩa là gì trong C++?] (Http://stackoverflow.com/q/18162522/514235). – iammilind

Trả lời

8

Thành ngữ này tồn tại để kích hoạt tính năng chaining chức năng gọi:

int a, b, c; 
a = b = c = 0; 

này hoạt động tốt cho int s, do đó không có điểm trong làm cho nó không làm việc cho người sử dụng định nghĩa loại :)

Tương tự như vậy đối với dòng nhà khai thác:

std::cout << "Hello, " << name << std::endl; 

hoạt động giống như

Do thành ngữ return *this, có thể chuỗi giống ví dụ đầu tiên.

7

Một trong những lý do tại sao *this được trả về để cho phép các chuỗi chuyển nhượng như a = b = c; tương đương với b = c; a = b;. Nói chung, kết quả của bài tập có thể được sử dụng ở mọi nơi, ví dụ: khi gọi các hàm (f(a = b)) hoặc trong biểu thức (a = (b = c * 5) * 10). Mặc dù, trong hầu hết các trường hợp, nó chỉ làm cho mã phức tạp hơn.

+1

Cũng trong 'if's;)' if (a = 5) ... '. Lỗi cổ điển do tính năng này. –

+0

Điều đó có ý nghĩa, tốt, cảm ơn bạn – scarface

0

bạn trả lại *this khi có ý thức mạnh mẽ rằng bạn sẽ gọi ra cùng một hành động trên đối tượng.

ví dụ, std::basic_string::append trở lại bản thân bởi vì có một ý thức mạnh mẽ rằng bạn sẽ muốn gắn thêm một chuỗi

str.append("I have ").append(std::to_string(myMoney)).append(" dollars");

cùng đi cho các operator =

myObj1 = myObj2 = myObj3

swap không có ý nghĩa mạnh mẽ này. biểu thức obj.swap(other).swap(rhs) có vẻ phổ biến không?

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