Что означает "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
).