Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с возвращаемым значением функции 
:(
    Опции темы
topspin
Дата 3.5.2006, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 3.5.2006

Репутация: нет
Всего: нет



Здравствуйте. 
Помогите разобраться со следующей стуацией: 

AnsiString s1 = "This is s1"; 
AnsiString s2 = "This is s2"; 

//Вариант 1 - рабочий... 
AnsiStringString &rs=(s1+s2); 
ShowMessage(rs); 

//Вариант 2 - не рабочий... 
AnsiString *ps=&(s1+s2); 
ShowMessage(*ps); 

Кстати так происходит всегда, если возвращается не ссылка на класс а сам класс, например в AnsiString так... AnsiString AnsiString::operator+(const AnsiString) 

т.е. вопрос - почему возвращенная стековая переменная не удаляется в первом случае и удаляется во втором - от чего это вообще зависит? 

Заранее спасибо!


 
PM MAIL   Вверх
Romikgy
Дата 3.5.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Я не гуру, но
Цитата(topspin @  3.5.2006,  08:51 Найти цитируемый пост)
т.е. вопрос - почему возвращенная стековая переменная не удаляется в первом случае и удаляется во втором - от чего это вообще зависит? 

где в первом варианте работа со стеком?
Цитата(topspin @  3.5.2006,  08:51 Найти цитируемый пост)
AnsiStringString &rs=(s1+s2); 

на кой здесь надо & ? 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Fazil6
Дата 3.5.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



Цитата

//Вариант 2 - не рабочий... 
AnsiString *ps=&(s1+s2); 

в данном случае ты пытаешься получить адрес временной переменной. результатом выражения s1+s2 является временная переменная, которая удаляется после вычисления выражения целиком. 
PM MAIL   Вверх
Vyacheslav
Дата 4.5.2006, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Да в общем оба варианта не рабочие. А то, что один из них работает - это на совести Borland. Хотя не совсем. Компилятор же при использовании "рабочего" варианта честно предупреждает, что ссылка инициализируется временным объектом. Ну а если программисту на это наплевать, то это его проблемы.
А если вопрос не теоретический, а практический, то оба варианта излишни. В  AnsiString используется механизм подсчета ссылок и поэтому при копировани и передаче AnsiString по значению копирования буфера не происходит. Следовательно, если Вы хотели избежать последнего, то Ваши усилия излишни.
 


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0766 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.