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

Объяснить термин "замыкание" и код - C++

Восстановить пароль Регистрация
 
Hunter13ua
46 / 46 / 5
Регистрация: 25.10.2011
Сообщений: 183
03.12.2013, 02:49     Объяснить термин "замыкание" и код #1
Замыкание (англ. closure) в программировании — функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде). Говоря другим языком, замыкание — функция, которая ссылается на свободные переменные в своём контексте.
Прочитал и всё равно ничего не понял. Даже код не помог. Прошу объяснить.
C++
1
2
3
4
5
6
7
8
9
function<int()> f() {
        int x = 0;
        return [=] () mutable {return ++x; };
}
 
auto fun = f();
for (int i = 0; i < 5; ++i) {
        cout << fun() << endl;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2013, 02:49     Объяснить термин "замыкание" и код
Посмотрите здесь:

Создайте вектор, хранящий десять строковых значений "zero", "one", ..., "nine" C++
Что означают команды "fun", "my_max", "my_min" в C++? C++
C++ Как принять код клавиши, а вписать саму клавишу? (Принимает "57", что означает "9")
C++ Что означает "Программа "[4872] laba!.exe: Машинный код" завершилась с кодом 3 (0x3)."?
C++ Написать программу которaя запрашиваeт у пользователя номер дня недели, затем выводит одно из сообщений "рабочий день", "суббота", "воскресенье"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bradobrei
Продам уран 238U
 Аватар для bradobrei
119 / 119 / 23
Регистрация: 22.01.2013
Сообщений: 298
03.12.2013, 06:35     Объяснить термин "замыкание" и код #2
Цитата Сообщение от Hunter13ua Посмотреть сообщение
Замыкание (англ. closure) в программировании — функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).
Может я ошибаюсь, но глобальные переменные полностью подходят для этой формулировки
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
03.12.2013, 11:50     Объяснить термин "замыкание" и код #3
Цитата Сообщение от Hunter13ua Посмотреть сообщение
Прочитал и всё равно ничего не понял. Даже код не помог. Прошу объяснить.
Ну оно пока понимать и не нужно для новичков, замыкание это когда вызывается функция в которую передаются ссылки без копирования, в общем если мы возьмем выражение a=b+c+d то мы его можем записать как a.operator=(b.operator+(c.operator+(d))); operator+ будет вызват 1 временных объекта, что бы этого не было используют такой механизм как замыкание, создается функция допустим int int_plac_int_plac(int& a, int& b, int& c); и уже для подсчета суммы трех переменных используется эта оптимизированная функция a=int_plac_int_plac(b,c,d); в которой объекты ссылки, получается мы замкнули 3 объекта в одном объекте и просто там уже создаем уже одну копию без создания промежуточного временного объекта. Замыкание это в общем можно сказать передача функции по ссылке нескольких объектов, а практическое применение видимо используется для оптимизации кода.
Новичкам это замыкание и нафиг не здалось, это нужно разработчикам библиотек. Программисты делятся на разработчиков классов и прикладных разработчиков тех которые используют классы, от как раз в разработке классов это и используется для оптимизации. Для прикладных программистов, а таких я думаю процентов 90 из всех, 10% токо разрабатывают классы и либы ИМХО, им оно и нафиг не здалось им более важны знания области для которой они создают программы. Так что не знаешь и забей на это, лучше изучай область своей разработки.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.12.2013, 12:11     Объяснить термин "замыкание" и код #4
Hunter13ua, Что именно не понятно? Мы создаем лямбду, которая захватывает из внешнего контекста копию переменной x и благодаря mutable мы можем изменять эту копию переменной внутри лямбды.
C++
1
2
3
4
auto fun = f();
for (int i = 0; i < 5; ++i) {
        cout << fun() << endl;
}
На момент инициализации fun у нас уже нету переменной x, которая созданна в функции f, а есть только ее копия в лямбде.

Добавлено через 4 минуты
Цитата Сообщение от ninja2 Посмотреть сообщение
Программисты делятся на разработчиков классов и прикладных разработчиков тех которые используют классы, от как раз в разработке классов это и используется для оптимизации. Для прикладных программистов, а таких я думаю процентов 90 из всех, 10% токо разрабатывают классы и либы ИМХО, им оно и нафиг не здалось им более важны знания области для которой они создают программы. Так что не знаешь и забей на это, лучше изучай область своей разработки.
Что я только что прочитал? То есть программисты, пишущие на С++, НЕ разрабатывают классы?
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
03.12.2013, 12:32     Объяснить термин "замыкание" и код #5
Цитата Сообщение от ForEveR Посмотреть сообщение
Что я только что прочитал? То есть программисты, пишущие на С++, НЕ разрабатывают классы?
Ну я имел введу программисты которые создают библиотеки, наборы классов и тех которые используют эти классы. Для вторых оптимизация редко когда нужна, а первым важно создавать правильный быстрый код, ну и если программист ссылки будет использовать и не знать что это замыкание, то ничего страшного.

Добавлено через 4 минуты
Цитата Сообщение от ninja2 Посмотреть сообщение
a.operator=(b.operator+(c.operator+(d)))
Тут я чуток ошибся нужно заменить на a.operator=(operator+(b,operator+(c,d)));

Вообще мой примерчик самый понятный, плюс практическая польза оптимизация кода!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.12.2013, 12:48     Объяснить термин "замыкание" и код #6
ninja2, Это НЕ является замыканием. Ссылка это ссылка. closure это closure.
Дабы понять, что Ваш пример не имеет никакого отношения к замыканию достаточно процитировать вот это:
функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).
Ну и можно ведь было почитать википедию дальше, где все объясняется...
Замыкание — это особый вид функции. Она определена в теле другой функции и создаётся каждый раз во время её выполнения. В записи это выглядит как функция, находящаяся целиком в теле другой функции. При этом вложенная внутренняя функция содержит ссылки на локальные переменные внешней функции. Каждый раз при выполнении внешней функции происходит создание нового экземпляра внутренней функции, с новыми ссылками на переменные внешней функции.
В случае замыкания ссылки на переменные внешней функции действительны внутри вложенной функции до тех пор, пока работает вложенная функция, даже если внешняя функция закончила работу, и переменные вышли из области видимости.
Замыкание связывает код функции с её лексическим окружением (местом, в котором она определена в коде). Лексические переменные замыкания отличаются от глобальных переменных тем, что они не занимают глобальное пространство имён. От переменных в объектах они отличаются тем, что привязаны к функциям, а не объектам.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
03.12.2013, 15:25     Объяснить термин "замыкание" и код #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Это НЕ является замыканием. Ссылка это ссылка. closure это closure.
Дабы понять, что Ваш пример не имеет никакого отношения к замыканию достаточно процитировать вот это:
Тот пример что я привел он в книге описан "Язык С++" Страуструп и именно это называли замыкание, цитировать неохота, а википедия недостоверный источник.
Я помню еще где то в своей теме приводил пример из книги и цитировал, там со мной кто то не соглашался, говорил что это не замыкание, короче доказал что я прав и это есть замыкание!

Добавлено через 22 минуты
А от токо вспомнил что там было, что называли замыканием, это я чуточку перепутал, ну оно похоже тоже самое.

От мы прибавляем a=b+c-d, у нас не функция вызывается которая принимает 3 ссылки, а b+c создает новый объект в котором содержаться ссылки на b и с и уже a=новый_объект-d и это в программировании называется замыканием отак было, то я уже чуток перекрутил, отета фигня наоборот все запутывает. А если у нас будет 3 операции перегружены для класса и нам нужно будет например посчитать выражение a=b+c-d+e, оно автоматически приобразуется к выражению a=новый_объект_1+новый_объект_2, и что это означает? Понятно что минус 2 временных объекта. Еще раз говорю это для создателей библиотек важно как можно оптимизировать код, сделать его более быстрым, менее затратным, обычным прикладным программистам оно и нафиг не здалось ИМХО. Создавать библиотеки вы дулю где устроитесь, будете писать прикладные проги, даже обобщенное программирование наврятле где нить будет ИМХО, так что не партесь.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.12.2013, 15:53     Объяснить термин "замыкание" и код #8
ninja2, Уважаемый, разбирайтесь в терминах пожалуйста. Замыкание это термин функционального программирования. Вот например замыкание
Python
1
2
3
4
5
6
7
def counter():
    x = 0
    def increment(y):
        nonlocal x
        x += y
        print(x)
    return increment
Функция возвращает функцию, которая определена в этой функции и оперирует с локальными данными этой функции.

http://stackoverflow.com/questions/3...t-is-a-closure
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
03.12.2013, 15:58     Объяснить термин "замыкание" и код #9
Цитата Сообщение от ninja2 Посмотреть сообщение
От мы прибавляем a=b+c-d, у нас не функция вызывается которая принимает 3 ссылки, а b+c создает новый объект в котором содержаться ссылки на b и с и уже a=новый_объект-d и это в программировании называется замыканием
) с чего ты так решил? При чём тут вообще замыкание?)
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
03.12.2013, 18:48     Объяснить термин "замыкание" и код #10
Цитата Сообщение от ForEveR Посмотреть сообщение
Уважаемый, разбирайтесь в терминах пожалуйста. Замыкание это термин функционального программирования. Вот например замыкание
Нет я при своем мнении останусь, при своем понятии этого термина.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2013, 19:49     Объяснить термин "замыкание" и код
Еще ссылки по теме:

C++ Как отключить автоматическое добавление "_" "@" "number" к имени экстернального метода?
На C++ в строке после символа - "+" поставить символ "*" и посчитать сколько "+" C++
C++ Объяснить программу, "Крестики-нолики"

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.12.2013, 19:49     Объяснить термин "замыкание" и код #11
ninja2, Браво. Успешной работы программистом Вам.
Yandex
Объявления
03.12.2013, 19:49     Объяснить термин "замыкание" и код
Ответ Создать тему
Опции темы

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