| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Делегаты и замыкания |
| Автор: drug007 3.10.2014, 08:16 |
| Добрый день. Может кто-нибудь прояснить отношения между делегатами и замыканиями? Вроде по отдельности понятно, но вместе не укладываются. В моем понимании делегат это "жирный" указатель, т.е. два указателя вместе - один на функцию, а второй на ее контекст. А замыкание это когда происходит во вложенной функции захват внешней переменной путем того, что компилятор автоматически выделяет под эту переменную память в куче и туда ее копирует. И отсюда у меня получается, что делегат == замыканию, а это не так. Буду благодарен, если кто просветит... updated: поиск пролил немного света - вроде как делегат это указатель на функцию-член класса, а замыкание, это то, что я привел выше. т.е. делегат это частный случай замыкания? |
| Автор: baldina 4.10.2014, 23:41 |
замыкание частный случай делегата |
| Автор: math64 6.10.2014, 08:06 |
| В Qt делегат это одно, в C# это другое, у Вас это что-то третее, непонятное мне. Полагаю, аналогично и с замыканием. Я знаю что такое замыкание в теории множеств, а что оно значит у Вас? |
| Автор: baldina 6.10.2014, 11:09 |
| ну давайте с терминологией разберемся. http://msdn.microsoft.com/ru-ru/library/ms173171.aspx в C# называется тип функции, используемый для передачи в качестве аргумента. анонимные функции могут использоваться везде, где ожидается делегат. в просторечии делегатом часто называется не тип, а сама функция, передаваемая в качестве аргумента. https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BC%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D0%B5_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) называется функция, ссылающаяся на контекст за своими пределами (на переменные, объявленные вне функции и не являющиеся параметрами). доступ к глобальным переменным (если они поддерживаются ЯП) есть у любой функции, поэтому замыкания имеют смысл когда функция определяется локально. В C# это анонимные функции. функции, принимающей делегата в качестве параметра, неважно, является ли делегат замыканием, т.к. он работает как черный ящик. |
| Автор: drug007 6.10.2014, 11:21 |
| Вроде теперь понятно. Получается, что делегат это просто функция, передаваемая как аргумент. А замыкание это более специализированный вариант делегата, потому что не только передается как аргумент, но и осуществляет захват внешнего контекста? |
| Автор: baldina 6.10.2014, 11:38 |
| ага |
| Автор: math64 6.10.2014, 12:12 |
| Понятно для C# и Java. Но здесь ведь раздел C++. Что для этого есть в C++? |
| Автор: xvr 6.10.2014, 12:22 |
В C++11 есть и то, и другое. std::function (делегат) и лямбда функции (замыкание). |