Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
m1namoto
0 / 0 / 0
Регистрация: 23.06.2012
Сообщений: 51
#1

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

28.09.2012, 20:36. Просмотров 1508. Ответов 9
Метки нет (Все метки)

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

Как правильно возвращать указатели из функции
Как правильно возвращать указатели? int* retPointer() { int* k; int j = 5; k =...

Как правильно возвращать строковый литерал из функции
Строковый литерал по сути представляет собой указатель на данные. Но что если...

Очистка памяти при завершении работы функции, как правильно возвращать значения?
Я вывел для себя 2 способа возвращать значения работы функции string...

Ошибка в функции (function: должна возвращать значение)
ребят, компилятор выдает error C4716: function: должна возвращать значение что...

Как лучше возвращать значение из операции-функции
В следующем коде при перегрузке оператора '+' функция возвращает ссылку на...

9
alsav22
5439 / 4834 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2012, 21:00 #2
Возвращаемое значение можно сохранить. Можно передать в функцию ссылку на переменную или указатель, и таким способом сохранить то, что нужно.
Цитата Сообщение от m1namoto Посмотреть сообщение
Там функция pop удаляет элемент с верхушки и одновременно возвращает его.
Это в Qt? Так и сделано. Метод имеет возвращаемое значение, которое можно сохранить. В STL метод pop() не имеет возвращаемого значения.
0
m1namoto
0 / 0 / 0
Регистрация: 23.06.2012
Сообщений: 51
28.09.2012, 21:07  [ТС] #3
С ссылками и указателями я умею) Интересует именно pop() без параметров, который возвращает значение, при этом очищая его. А так же почему локально объявленный объект в функции после окончания функции не удаляется ?
0
alsav22
5439 / 4834 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2012, 21:13 #4
Цитата Сообщение от m1namoto Посмотреть сообщение
А так же почему локально объявленный объект в функции после окончания функции не удаляется ?
Память, которую он занимает, объявляется свободной, это и есть удаление.

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

Добавлено через 3 минуты
Цитата Сообщение от m1namoto Посмотреть сообщение
А так же почему локально объявленный объект в функции после окончания функции не удаляется ?
На основании чего сделан такой вывод?
0
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.
0
I.M.
567 / 550 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
28.09.2012, 22:52 #8
m1namoto, возвращаемый локальный объект копируется в стэк. Благополучно возвращается его копия. (возможна оптимизация компилятором)
И я не про QT стэк говорю)

А теперь про QT стэк:
T QStack:: pop ()
т.е. возвращается все так же по значению
0
alsav22
5439 / 4834 / 831
Регистрация: 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;
}
0
m1namoto
0 / 0 / 0
Регистрация: 23.06.2012
Сообщений: 51
28.09.2012, 23:05  [ТС] #10
Спасибо, теперь все по полочкам разложено
0
28.09.2012, 23:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2012, 23:05

.Написать функцию, которая будет возвращать значение y=ln(x)+x при входящем параметре x. Построить таблицу значений этой функции
.Написать функцию, которая будет возвращать значение y=ln(x)+x при входящем...

Что значит возвращать значение
Функция возвращает значение; функция удаляет, но не возвращает значения;...

Из функции возвращать различные значения
Ребят, помогите. Имеется такой код, мне надо,чтобы из функции возвращались...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru