Что означает "return * this" в C++?

Я конвертирую программу на C++ в C#, но эта часть меня смутила. Что означает return *?

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

Как это перевести на C#?

6 ответов


this означает указатель на объект, так *this - это объект. Таким образом, вы возвращаете объект ie,*this возвращает ссылку на объект.


следите, что если вы пытаетесь использовать return *this; для функции, тип возврата которой Type, а не Type&, C++ попытается сделать копию объекта, а затем немедленно вызовет деструктор, обычно не предполагаемое поведение. Так что возвращаемый тип должен быть ссылкой, как в вашем примере.


в вашем конкретном случае вы возвращаете ссылку на "это", так как возвращаемый тип функции является ссылкой (&).

говоря о размере возвращаемой памяти, это то же самое, что и

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

но использование во время вызова отличается.

во время вызова вы вызовете store возвращаемое значение функции чем-то вроде:

Message& m = GetProtoMsg();

вы просто возвращаете ссылку на объект. this является указателем, и вы разыменовываете его.

переводится на C# return this; в том случае, если вы не имеете дело с примитивом.


используя указатель, мы можем напрямую получить доступ к значению, хранящемуся в переменной, на которую он указывает. Для этого мы просто должны предшествовать идентификатору указателя звездочкой ( * ), которая действует как dereference оператор, и это можно буквально перевести на "значение, указанное".


как в C# this является неявным указателем на объект, который вы используете в настоящее время.
В вашем конкретном случае, как вы возвращаете ссылку & для объекта необходимо использовать *this Если вы хотите вернуть объект, над которым вы сейчас работаете.
Не забывайте, что ссылка принимает переменную сама по себе или в случае указателя (this), объект, на который указывает (*this), а не указатель (this).