Показать полную графическую версию : [решено] [C++] *Теория* | Что значит возвратить ссылку?
Я прочитал несколько книг по C++, где объясняется возвращение ссылки функцией, но так и не понял суть этого вопроса.
Объясните пожалуйста что значит возвратить ссылку.
Например есть следующий пример кода:
int& func(int a)
{
int * temp = new int(5);
return *temp;
}
Что конкретно возвращает функция? В чем основной смысл?
Оператором new ты выделяешь 20 байт в памяти.
Далее возвращаешь указатель на этот кусок памяти, грубо говоря указатель - это адрес 1 элемента куска памяти.
DillerInc
25-02-2007, 18:38
где объясняется возвращение ссылки функцией
...это что же за книги такие,где старый добрый указатель именуется как ссылка ??
:huh:
DillerInc
Вообще-то, в языке C++ ссылки и указатели это разные понятия. Если по простому, то ссылка это указатель, который всегда на что-то указывает, значение которого нельзя изменить (именно указателя, а не того, на что он указывает; т.е значение устанавливается только один раз - при связке ссылки с тем, на что она ссылается), и весь синтаксис работы со ссылками такой же как с обычными переменными, а не указателями.
JJester
int& func(int a)
{
int * temp = new int(5);
return *temp;
}
В данном случае использование ссылки некрасиво и даже вредно (т.к. маскируется, то что память надо будет ещё и освобождать). Здесь лучше использовать указатель.
А про кореектное использование ссылок лучше почитать в какой-нибудь хорошей книге. Например, перегруженный operator= как правило возвращает ссылку. (В результате можно делать трюки вроде while ((token = next_token()) != LAST_TOKEN) do_something(); со своими произвольными классами)
ещё полезные примеры использования ссылки
// аналог with в делфи:
// допустим есть структура struct1_type struct1, в ней struct2_type struct2, в ней int field1, int field2, ...;
// без ссылок:
struct1.struct2.field1 = 1;
struct1.struct2.field1 = 2;
...
// со ссылкой:
{
struct2_type& s(struct1.struct2);
s.field1 = 1;
s.field2 = 2;
...;
}
уменьшение операций копирования при передачи сложных объектов как параметров (по ссылке)
// void Window::setText(const string& s)
// Point Window::setMeasure(const string& s);
// class Form1 : Window {...};
void TForm1::setText(const string& s)
{
setMinimumSize(measureText(s)); // не копируется, а передаётся та же строка (её адрес)
Window::setText(s); // опять не было копирования
}
...
// создалась переменная типа string, инициализировалась строкой
// потом от неё взялся адрес и отправился в виде ссылки как параметр Form1::setText
// при выходе из функции string уничтожился
form1.setText("Form1 caption");
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.