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