Форум программистов, компьютерный форум CyberForum.ru

Правильно возвращать значение из функции - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
m1namoto
0 / 0 / 0
Регистрация: 23.06.2012
Сообщений: 51
28.09.2012, 20:36     Правильно возвращать значение из функции #1
Есть недопонимание в этом вопросе. Понимаю, что локальные переменные вернуть нельзя, так как они удаляются при завершении функции. Но допустим при возвращении объекта, объявленного в данной функции(пробовал с QString), все проходит удачно. Так же интересует на примере стека на базе списка ... Там функция pop удаляет элемент с верхушки и одновременно возвращает его. Как это реализовано ?
Заранее благодарен!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2012, 20:36     Правильно возвращать значение из функции
Посмотрите здесь:

Как лучше возвращать значение из операции-функции C++
C++ error C4716: Distance::getdist: должна возвращать значение
.Написать функцию, которая будет возвращать значение y=ln(x)+x при входящем параметре x. Построить таблицу значений этой функции C++
Ошибка в функции (function: должна возвращать значение) C++
почему нельзя в операторе + возвращать оригинальное значение(по ссылке), а не копию. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2012, 21:00     Правильно возвращать значение из функции #2
Возвращаемое значение можно сохранить. Можно передать в функцию ссылку на переменную или указатель, и таким способом сохранить то, что нужно.
Цитата Сообщение от m1namoto Посмотреть сообщение
Там функция pop удаляет элемент с верхушки и одновременно возвращает его.
Это в Qt? Так и сделано. Метод имеет возвращаемое значение, которое можно сохранить. В STL метод pop() не имеет возвращаемого значения.
m1namoto
0 / 0 / 0
Регистрация: 23.06.2012
Сообщений: 51
28.09.2012, 21:07  [ТС]     Правильно возвращать значение из функции #3
С ссылками и указателями я умею) Интересует именно pop() без параметров, который возвращает значение, при этом очищая его. А так же почему локально объявленный объект в функции после окончания функции не удаляется ?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2012, 21:13     Правильно возвращать значение из функции #4
Цитата Сообщение от m1namoto Посмотреть сообщение
А так же почему локально объявленный объект в функции после окончания функции не удаляется ?
Память, которую он занимает, объявляется свободной, это и есть удаление.

Добавлено через 1 минуту
Цитата Сообщение от m1namoto Посмотреть сообщение
Интересует именно pop() без параметров, который возвращает значение, при этом очищая его
Что именно интересует? Что не понятно? Очищая что?
m1namoto
0 / 0 / 0
Регистрация: 23.06.2012
Сообщений: 51
28.09.2012, 21:14  [ТС]     Правильно возвращать значение из функции #5
Мб вы прочитали удаляется ? Или я не понимаю при чем тут это утверждение)
Я написал в первом посте. Стек реализованый на базе списка ... Как вернуть значение и очистить память не передавая параметров ? Или такое возможно только со стеками на базе массивов ?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2012, 21:35     Правильно возвращать значение из функции #6
Вы о каком-то конкретном стеке (Qt, STL) речь ведёте или о своей реализации? Если о своей, то код покажите.

Добавлено через 3 минуты
Цитата Сообщение от m1namoto Посмотреть сообщение
А так же почему локально объявленный объект в функции после окончания функции не удаляется ?
На основании чего сделан такой вывод?
m1namoto
0 / 0 / 0
Регистрация: 23.06.2012
Сообщений: 51
28.09.2012, 22:47  [ТС]     Правильно возвращать значение из функции #7
C++ (Qt)
1
2
3
4
5
6
7
8
9
QString mk_M(QList<QString> &lst){
    QString a;
    for(int i=0; i<lst.count(); i++){
        a = a + lst.at(i);
        if(i!=lst.count()-1)
            a = a + "; ";
}
return a;
}
a благополучно возвращается. А стек имел в виду Qt.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
28.09.2012, 22:52     Правильно возвращать значение из функции #8
m1namoto, возвращаемый локальный объект копируется в стэк. Благополучно возвращается его копия. (возможна оптимизация компилятором)
И я не про QT стэк говорю)

А теперь про QT стэк:
T QStack:: pop ()
т.е. возвращается все так же по значению
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2012, 22:58     Правильно возвращать значение из функции #9
Цитата Сообщение от m1namoto Посмотреть сообщение
a благополучно возвращается
Возвращается не a, а копия а. Сам объект удаляется.
Перепишите этот код, например, так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
QString* mk_M(QList<QString> &lst)
{
    QString a;
    for(int i=0; i<lst.count(); i++){
        a = a + lst.at(i);
        if(i!=lst.count()-1)
            a = a + "; ";
}
return &a;
}
И попробуйте вывести содержимое по возвращённому адресу. Больше раза не получится. Там будет мусор. Для ясности:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <cstdlib>
#include <iostream>
using namespace std;
 
int* f()
{
    int a = 5;
    return &a;
}
 
int main()
{
     
    int* b = f();
    cout << *b << endl;
    cout << *b << endl;
    
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2012, 23:05     Правильно возвращать значение из функции
Еще ссылки по теме:

Односвязные списки: нужно ли при выходе из функции возвращать голову? C++
Почему плохо возвращать указатель из функции? C++
Как правильно возвращать указатели из функции C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
m1namoto
0 / 0 / 0
Регистрация: 23.06.2012
Сообщений: 51
28.09.2012, 23:05  [ТС]     Правильно возвращать значение из функции #10
Спасибо, теперь все по полочкам разложено
Yandex
Объявления
28.09.2012, 23:05     Правильно возвращать значение из функции
Ответ Создать тему
Опции темы

Текущее время: 04:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru