Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] [C++] *Теория* | Что значит возвратить ссылку? (http://forum.oszone.net/showthread.php?t=79989)

JJester 25-02-2007 15:00 555029

[решено] [C++] *Теория* | Что значит возвратить ссылку?
 
Я прочитал несколько книг по C++, где объясняется возвращение ссылки функцией, но так и не понял суть этого вопроса.
Объясните пожалуйста что значит возвратить ссылку.
Например есть следующий пример кода:
Код:

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

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

suxxl 25-02-2007 15:55 555051

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

DillerInc 25-02-2007 18:38 555095

Цитата:

где объясняется возвращение ссылки функцией
...это что же за книги такие,где старый добрый указатель именуется как ссылка ??

:huh:

ivank 26-02-2007 00:39 555208

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 556599

ещё полезные примеры использования ссылки
Код:

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



Время: 01:40.

Время: 01:40.
© OSzone.net 2001-