Войти

Показать полную графическую версию : [решено] [C++] *Теория* | Что значит возвратить ссылку?


JJester
25-02-2007, 15:00
Я прочитал несколько книг по C++, где объясняется возвращение ссылки функцией, но так и не понял суть этого вопроса.
Объясните пожалуйста что значит возвратить ссылку.
Например есть следующий пример кода:

int& func(int a)
{
int * temp = new int(5);
return *temp;
}


Что конкретно возвращает функция? В чем основной смысл?

suxxl
25-02-2007, 15:55
Оператором new ты выделяешь 20 байт в памяти.
Далее возвращаешь указатель на этот кусок памяти, грубо говоря указатель - это адрес 1 элемента куска памяти.

DillerInc
25-02-2007, 18:38
где объясняется возвращение ссылки функцией
...это что же за книги такие,где старый добрый указатель именуется как ссылка ??
:huh:

ivank
26-02-2007, 00:39
DillerInc
Вообще-то, в языке C++ ссылки и указатели это разные понятия. Если по простому, то ссылка это указатель, который всегда на что-то указывает, значение которого нельзя изменить (именно указателя, а не того, на что он указывает; т.е значение устанавливается только один раз - при связке ссылки с тем, на что она ссылается), и весь синтаксис работы со ссылками такой же как с обычными переменными, а не указателями.

JJester
int& func(int a)
{
int * temp = new int(5);
return *temp;
}
В данном случае использование ссылки некрасиво и даже вредно (т.к. маскируется, то что память надо будет ещё и освобождать). Здесь лучше использовать указатель.

А про кореектное использование ссылок лучше почитать в какой-нибудь хорошей книге. Например, перегруженный operator= как правило возвращает ссылку. (В результате можно делать трюки вроде while ((token = next_token()) != LAST_TOKEN) do_something(); со своими произвольными классами)

pva
28-02-2007, 22:48
ещё полезные примеры использования ссылки

// аналог 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