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

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

Войти
Регистрация
Восстановить пароль
 
Hunter13ua
46 / 46 / 5
Регистрация: 25.10.2011
Сообщений: 183
#1

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

03.12.2013, 02:49. Просмотров 1176. Ответов 10
Метки нет (Все метки)

Замыкание (англ. 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2013, 02:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объяснить термин "замыкание" и код (C++):

Объяснить термин "абстрактный тип данных" - C++
Почему именно он абстрактный? Не зависит от типа входных параметров, а еще от чего?

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Объяснить что такое "раздельная компиляция", что такое "интерфейс класса" и "реализация класса" на примере - C++
Есть класс, содержащий объекты и конструктор. Конструктор объявляется в одном из cpp файлов(их несколько). Можно ли, как-то, использовать...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Как принять код клавиши, а вписать саму клавишу? (Принимает "57", что означает "9") - C++
Нужно избавиться от такой глупости: char ch = 0; if(ch=='1')mas=1; if(ch=='2')mas=2; if(ch=='3')mas=3; ...

Что означает "Программа "[4872] laba!.exe: Машинный код" завершилась с кодом 3 (0x3)."? - C++
при запуске кода компилятор пишет &quot;Программа &quot; laba!!!!!!.exe: Машинный код&quot; завершилась с кодом 3 (0x3).&quot; и появляется окошечко с ошибкой....

10
bradobrei
Продам уран 238U
119 / 119 / 23
Регистрация: 22.01.2013
Сообщений: 298
03.12.2013, 06:35 #2
Цитата Сообщение от Hunter13ua Посмотреть сообщение
Замыкание (англ. closure) в программировании — функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).
Может я ошибаюсь, но глобальные переменные полностью подходят для этой формулировки
0
ninja2
231 / 187 / 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% токо разрабатывают классы и либы ИМХО, им оно и нафиг не здалось им более важны знания области для которой они создают программы. Так что не знаешь и забей на это, лучше изучай область своей разработки.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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% токо разрабатывают классы и либы ИМХО, им оно и нафиг не здалось им более важны знания области для которой они создают программы. Так что не знаешь и забей на это, лучше изучай область своей разработки.
Что я только что прочитал? То есть программисты, пишущие на С++, НЕ разрабатывают классы?
0
ninja2
231 / 187 / 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)));

Вообще мой примерчик самый понятный, плюс практическая польза оптимизация кода!
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
03.12.2013, 12:48 #6
ninja2, Это НЕ является замыканием. Ссылка это ссылка. closure это closure.
Дабы понять, что Ваш пример не имеет никакого отношения к замыканию достаточно процитировать вот это:
функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).
Ну и можно ведь было почитать википедию дальше, где все объясняется...
Замыкание — это особый вид функции. Она определена в теле другой функции и создаётся каждый раз во время её выполнения. В записи это выглядит как функция, находящаяся целиком в теле другой функции. При этом вложенная внутренняя функция содержит ссылки на локальные переменные внешней функции. Каждый раз при выполнении внешней функции происходит создание нового экземпляра внутренней функции, с новыми ссылками на переменные внешней функции.
В случае замыкания ссылки на переменные внешней функции действительны внутри вложенной функции до тех пор, пока работает вложенная функция, даже если внешняя функция закончила работу, и переменные вышли из области видимости.
Замыкание связывает код функции с её лексическим окружением (местом, в котором она определена в коде). Лексические переменные замыкания отличаются от глобальных переменных тем, что они не занимают глобальное пространство имён. От переменных в объектах они отличаются тем, что привязаны к функциям, а не объектам.
0
ninja2
231 / 187 / 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 временных объекта. Еще раз говорю это для создателей библиотек важно как можно оптимизировать код, сделать его более быстрым, менее затратным, обычным прикладным программистам оно и нафиг не здалось ИМХО. Создавать библиотеки вы дулю где устроитесь, будете писать прикладные проги, даже обобщенное программирование наврятле где нить будет ИМХО, так что не партесь.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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/36636/what-is-a-closure
2
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
03.12.2013, 15:58 #9
Цитата Сообщение от ninja2 Посмотреть сообщение
От мы прибавляем a=b+c-d, у нас не функция вызывается которая принимает 3 ссылки, а b+c создает новый объект в котором содержаться ссылки на b и с и уже a=новый_объект-d и это в программировании называется замыканием
) с чего ты так решил? При чём тут вообще замыкание?)
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
03.12.2013, 18:48 #10
Цитата Сообщение от ForEveR Посмотреть сообщение
Уважаемый, разбирайтесь в терминах пожалуйста. Замыкание это термин функционального программирования. Вот например замыкание
Нет я при своем мнении останусь, при своем понятии этого термина.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
03.12.2013, 19:49 #11
ninja2, Браво. Успешной работы программистом Вам.
0
03.12.2013, 19:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2013, 19:49
Привет! Вот еще темы с ответами:

Error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в "код операции"; обнаружено "SHL" - C++
visual studio выдал такую ошибку error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в &quot;код операции&quot;; обнаружено...

Написать код шифрования методом "Змеиный" и "Спиральный" - C++
весь интернет перерыл, не могу найти ничего нормального, если кто может или знает напишите хоть ссылки, срочно нужно

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...


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

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

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