Я в настоящее время на курсе C ++ и я борюсь с ссылками. Я знаю, что есть некоторые похожие темы, но я не смог найти ответ на этот вопрос.
Дело в том, что мой Проф хочет, чтобы мы использовали ссылки при возврате объектов, поэтому возврат по значению или использование указателя в качестве возврата не вариант.
Так что я предполагаю, что мне нужно использовать динамически выделенный объект (возвращение ссылки на локальный объект заканчивается путаницей … верно?)
1. Complex& method() {
2. Complex *object = new Complex();
3. return *object; }
Вот где я борюсь, как я могу поймать право возврата?
1. Complex one = object.method();
Насколько я понимаю, с этим я получу только копию и утечку памяти
Так как же мне поймать его указателем?
1. Complex *two = new Complex();
2. delete two;
3. *two = object.method();
кажется, это работает, но есть ли способ сделать это только в одной строке? Или это должно быть сделано иначе?
мой Проф хочет, чтобы мы использовали ссылки при возврате объектов
Когда я прочитал это, моей первой мыслью было, что ваш профессор имел в виду:
void method(Complex& nonConstPassByReference)
{
nonConstPassByReference.data = 10;
}
или же
int method(Complex& nonConstPassByReference)
{
nonConstPassByReference.data = 10;
return (0); // no error occurred
}
И когда я использую эту технику, я теперь использую
std::string method(Complex& nonConstPassByReference)
{
std::stringstream ss;
nonConstPassByReference.data = 10;
// more stuff
if (anErrorOccurred)
ss << errorDescriptionInfo << std::endl;
return (ss.str()); // no error occurred when return size is 0
}
Это происходит из-за идеи, что в общем случае все методы или функции могут иметь два вида формальных параметров. Мы называем их передачей по значению и передачей по ссылке.
В общем, все функции / методы могут иметь как входные, так и выходные формальные параметры. И обычно входные параметры передаются по значению. Выходные параметры не являются const-pass-by-reference, предлагая телу метода отправлять свои результаты обратно в предварительно собранный экземпляр вызывающего кода.
Иногда переменные передачи по ссылке используются для параметров «вход-метод» (возможно, для производительности — чтобы избежать дорогостоящей копии). В этом случае параметры input-to-method-pass-by-reference должны быть помечены ‘const’, чтобы попросить компилятор сгенерировать ошибку, если код попытается изменить этот ввод.
Обратите внимание, что многие функции C НЕ возвращают значение, которое является частью действия … вместо этого return является индикацией «произошла ошибка», а описание ошибки хранится в errno.
Одна идея состоит в том, чтобы хранить возвращенный объект внутри вашего объекта:
class Obj {
public:
Complex &method() { c.data = 10; return c; }
private:
Complex c;
};
Таким образом, нет возврата локальной переменной или выделения кучи.
возврат ссылки эффективен при возврате члена класса,
лайк:
class A{
Complex member;
public:
Complex& method(){
return member;
}
};
Вы также можете вернуть ссылку таким образом, чтобы вернуть некоторый статический или глобальный объект, который не может быть NULL, например:
Complex& method() {
static Complex c; // c cant be null
return c;
}
Преимущество использования ссылки в том, что вы можете использовать вызов функции как объект, например: cin>>method().real>>method().img;
и использовать один и тот же объект, даже если вы вызываете метод несколько раз.
Но ваш код не может использовать ссылки, потому что каждый вызов создает новый экземпляр.
если вы используете динамическое размещение, вы должны вернуть указатель:
Complex* method() {
return new Complex();
}
и вы должны помнить, чтобы удалить его.