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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
m1namoto
0 / 0 / 0
Регистрация: 23.06.2012
Сообщений: 51
#1

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

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

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

Как правильно возвращать указатели из функции - C++
Как правильно возвращать указатели? int* retPointer() { int* k; int j = 5; k = &j; return k; } void main() { int* n =...

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

Очистка памяти при завершении работы функции, как правильно возвращать значения? - C++
Я вывел для себя 2 способа возвращать значения работы функции string Add(string a1, string a2) { string returnStr; returnStr +=...

Как лучше возвращать значение из операции-функции - C++
В следующем коде при перегрузке оператора '+' функция возвращает ссылку на временный объект Point&operator+(int d) и Point&operator+(int...

Ошибка в функции (function: должна возвращать значение) - C++
ребят, компилятор выдает error C4716: function: должна возвращать значение что это значит? как с этим бороться? #include "stdafx.h" ...

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

9
alsav22
5421 / 4816 / 442
Регистрация: 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
5421 / 4816 / 442
Регистрация: 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
5421 / 4816 / 442
Регистрация: 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.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
28.09.2012, 22:52 #8
m1namoto, возвращаемый локальный объект копируется в стэк. Благополучно возвращается его копия. (возможна оптимизация компилятором)
И я не про QT стэк говорю)

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

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

Из функции возвращать различные значения - C++
Ребят, помогите. Имеется такой код, мне надо,чтобы из функции возвращались различные значения. Как это реализовать? #include &lt;iostream&gt; ...

error C4716: Distance::getdist: должна возвращать значение - C++
уменя visual c++ 2010 professional.как решить проблему ? #include &lt;iostream&gt; using namespace std; /// class Distance { ...

Почему плохо возвращать указатель из функции? - C++
Почему плохо то, что мы возвращаем указатель?(return rez) #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define SIZE 10 int*...


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

Или воспользуйтесь поиском по форуму:
10
Yandex
Объявления
28.09.2012, 23:05
Ответ Создать тему
Опции темы

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