2013-08-10 38 views
7

Tôi đang chuyển đổi chương trình C++ thành C#, nhưng phần này khiến tôi bối rối. Trả về * điều này có nghĩa là gì?'Return * this' có nghĩa là gì trong C++?

template< EDemoCommands msgType, typename PB_OBJECT_TYPE > 
class CDemoMessagePB : public IDemoMessage, public PB_OBJECT_TYPE 
{ 
    (...) 
    virtual ::google::protobuf::Message& GetProtoMsg() { return *this; } 
} 

Làm thế nào nó dịch thành C#?

+0

Thẻ phải là C++. –

Trả lời

13

this nghĩa con trỏ đến đối tượng, vì vậy *this là một đối tượng. Vì vậy, bạn đang trả về một đối tượng tức là, *this trả về một tham chiếu đến đối tượng.

2

Bạn vừa trả lại tham chiếu cho đối tượng. this là một con trỏ và bạn đang dereferencing nó.

Nó chuyển thành C# return this; trong trường hợp bạn không xử lý nguyên thủy.

2

Trong trường hợp cụ thể của bạn, bạn đang trả lại tham chiếu đến 'this', vì kiểu trả về của hàm là tham chiếu (&). Phát biểu

kích thước của bộ nhớ trở lại, nó cũng giống như

virtual ::google::protobuf::Message* GetProtoMsg() { return this; } 

Nhưng việc sử dụng vào thời điểm cuộc gọi khác.

Vào lúc cuộc gọi, bạn sẽ gọi cho lưu trữ các giá trị trả về của hàm bởi một cái gì đó như:

Message& m = GetProtoMsg(); 
+1

Nó không phải là "giống nhau" như trả lại một con trỏ. Nó là loại tương tự. – juanchopanza

+0

Chính xác. Đã chỉnh sửa^^ – Lake

1

Sử dụng con trỏ, chúng tôi có thể trực tiếp truy cập giá trị được lưu trữ trong biến mà nó trỏ đến. Để thực hiện điều này, chúng tôi chỉ cần đặt trước dấu nhận dạng con trỏ bằng dấu sao (*), hoạt động như toán tử dereference và có thể được dịch sang nghĩa đen là "giá trị được chỉ bởi".

1

Giống như trong C# this là một con trỏ ẩn đối tượng mà bạn hiện đang sử dụng.
Trong trường hợp cụ thể của bạn, khi bạn trả lại tham chiếu & cho đối tượng, bạn phải sử dụng *this nếu bạn muốn trả về đối tượng mà bạn hiện đang làm việc.
Đừng quên rằng tham chiếu tự biến, hoặc trong trường hợp con trỏ (this), đối tượng được trỏ đến (*this), nhưng không phải con trỏ (this).

8

Hãy chú ý rằng nếu bạn cố gắng sử dụng return *this; trên một hàm có kiểu trả về là Type và không Type&, C++ sẽ cố gắng tạo một bản sao của đối tượng và sau đó gọi hàm hủy ngay lập tức. Vì vậy, kiểu trả về phải là một tham chiếu như trong ví dụ của bạn.