Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: возвращение ссылки переменной объявлено в вызываемой функции  (Прочитано 11158 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Olegator
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 31-12-2005 00:15 » 

Цитата из учебника "Как программировать на С++" Дейтел Х., Дейтел П.
Цитата
Функции могут возвращать ссылки, но здесь надо быть осторожным. Если возвращение ссылки переменной объявлено в вызываемой функции, переменная должна быть объявлена внутри этой функции как static. В противном случае ссылка адресуется автоматической переменной, которая после завершения функции уничтожается; в таком случае говорят, что переменная «не определена» и поведение программы непредсказуемо.
Что значит
Цитата
возвращение ссылки переменной объявлено в вызываемой функции
. Имеется ввиду, что ссылка переменной объявлена в функции, а затем возвращается через return?
Т.е.:
Код:
int func()
{
static int x = 3;
&y = x;
return y;
}

Это условие объявления переменной, как static, касается всех функций кроме main? Или в main тоже надо соблюдать это условие?
« Последнее редактирование: 31-12-2005 00:16 от Olegator » Записан
acc15
Гость
« Ответ #1 : 31-12-2005 02:19 » 

имелось ввиду

int& func()// Ошибка
{
int x = 3;   
return x;
}

int& func()// Правильно
{
static int x = 3;   
return x;
}
Записан
Olegator
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 31-12-2005 08:03 » 

Компилятор сам догадается, что надо возвращать ссылку?
Т.е. не надо писать return &x;

В книге написано, что по отношению к переменной можно писать int &x; или int& x;
По отношению к функции, как я понял, так не запишешь: int &func() Или можно?

И на счёт последнего вопроса.
Это условие объявления переменной, как static, касается всех функций кроме main? Или в main тоже надо соблюдать это условие?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 31-12-2005 08:20 » 

Olegator Статик то ты можеш объявлять и в main только какая от этого польза. Эту функцию вызывают всего один раз во время исполнения программы. Повторного вызова я лично не встречал ни разу. Компилятор у меня спокойно сьел издевательства над функцией main.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Mayk
Гость
« Ответ #4 : 31-12-2005 16:18 » 

Повторного вызова я лично не встречал ни разу. Компилятор у меня спокойно сьел издевательства над функцией main.
main нельзя вызывать повторно. Ну и получать адрес main'а (ptr = &main) тоже нельзя. По стандарту.

PS. Видел исходник на Си, который повторно вызывал main несколько раз и выводил на экран jingle bells. К сожалению сейчас найти н могу Жаль

Записан
acc15
Гость
« Ответ #5 : 01-01-2006 15:04 » 

Цитата
Компилятор сам догадается, что надо возвращать ссылку?
Т.е. не надо писать return &x;
Естественно...

Цитата
int &x; int& x;
Это всё одно и то же... без разницы где стоит &, главное чтоб между int и именем переменной...

Цитата
int &func() Или можно?
Можно как и в предидущем, как и с указателем... int *func()... а если тебе нужен указатель на ф-цию, то без скобок тут никак
int (*func)()

main можно вызывать сколько душе угодно, просто зачем... и у main можно брать адрес... и в Borland-компиляторе и в Microsoft-овском, а вот насчет стандарта, может и так... хотя глупо получается, то что нельзя брать адрес main'a
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #6 : 16-04-2006 22:00 » 

Хочу только заметить (может опечатка...), что
"Т.е. не надо писать return &x;"
это не возвращение ссылки, а возвращение адреса, возвращение же ссылки пишется так - return x;
Записан

С уважением Lapulya
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 16-04-2006 22:56 » 

Хм, а через возвращение адреса отличается от возвращения ссылки?
Записан

ещё один вопрос ...
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #8 : 16-04-2006 23:09 » new

Смотря с какой точки зрения... С точки зрения синтаксиса - отличается, например:
вот возвращаем ссылку
int & f ()
{
static int a = 10;
return a;
}

а вот возвращаем адрес
int * f ()  // звездочка вместо амперсенда
{
static int a = 10;
return &a;  //  амперсенд есть!!!
}

а с точки зрения рассматриваемого вопроса (т.е. о возврате ссылки на локальную переменную функции) никакой разницы нет...
Записан

С уважением Lapulya
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines