34:34 (Можно явно создать указатель на нужную версию функции и вызвать её с параметрами, такое встречается на практике в Qt (у меня), для выбора нужной версии слота) void f(int&) { std::cout
@@mesyarik Там даже есть ещё одна проблема, где можно данным способом решить, а что если я заведу указатель на функцию f у которой 2 перегрузки, одна от int, а вторая от std::vector, какой адрес он должен поместить в указатель? Там тоже нужен явный тип или каст, нельзя будет написать auto ptr = &f;
@@mesyarik Илья, привет! Мне кажется, что соль в том, что все исходит из языка Си, в котором указатели на функции являются типизированными в том смысле, что при их описании необходимо указывать профиль функции. Это является плюшевой абстракцией в том смысле, что компилятору необходимо знать, с какого рода функциями он может работать ( помнить адрес в данной переменной - указателе ) требовать кол-во аргументов, расправляться ретёрн-вэлью. Теперь в бой вступает декорирование имён функций. Выбрать явно необходимую функцию компил не может без контекста, а контекст для неявного каста укажет тип лвэлью. В этом мы можем убедиться, написав выражение &f; - напишет, что ему неочевидно. ( если функция имеет не один профиль ). Выход - кастовать. Если у функции нет перегрузок, то компил вполне удачно выведет тип указателя на функции с тем же auto. То есть, как я это понимаю, это наследие языка Си . И вполне логичное для компилятора. Указатель требует лишь "подчинения" профилю - это и является "типом указателя функции". Вот пример кода: #include void f(int&) { std::cout
Липман, "Язык программирования Си++, базовый курс", у меня стр. 323, "Указатели на перегруженные функции", "...Компилятор использует тип указателя для выявления используемой версии перегруженной функции. Тип указателя должен точно соответствовать одной из версий .." P.S. Я когда читал, вообще на это внимание не обратил, а сейчас понял - оказывается актуальный вопрос!
Инкапсуляция - это наличие неких уникальных свойств объекта, обеспечивающих возможность обобщить его до некого множества. Иначе, если есть что-то что позволяет говорить о неком наборе данных или наборе функций как о свойствах и методах объекта, если мы можем построить некую хорошо узнаваемую ассоциацию функционального кола с общепринятым устоявшимся гуманитарным понятием, то мы можем осуществить инкапсуляцию. Проще говоря, создание классов объектов и есть инкапсуляция.
сбивать ссылку нужно когда мы перегружаем две похожие функции для конст и неконст аргументов и всю реальную логику пишем в конст версии, а в не конст версии мы сначала адаптируем аргумент к конст версии, а потом снимаем конст строгость с результата конст версии и возвращаем результат со сбитым конст. :)
😍😍😍😍😍Спасибо
👍👍👍👍👍👍👍👍
34:34 (Можно явно создать указатель на нужную версию функции и вызвать её с параметрами, такое встречается на практике в Qt (у меня), для выбора нужной версии слота)
void f(int&) { std::cout
@@mesyarik Просто неявный каст, вообще можно написать так: auto ptr = static_cast(&f);
@@mesyarik Там даже есть ещё одна проблема, где можно данным способом решить, а что если я заведу указатель на функцию f у которой 2 перегрузки, одна от int, а вторая от std::vector, какой адрес он должен поместить в указатель? Там тоже нужен явный тип или каст, нельзя будет написать auto ptr = &f;
@@mesyarik Илья, привет! Мне кажется, что соль в том, что все исходит из языка Си, в котором указатели на функции являются типизированными в том смысле, что при их описании необходимо указывать профиль функции. Это является плюшевой абстракцией в том смысле, что компилятору необходимо знать, с какого рода функциями он может работать ( помнить адрес в данной переменной - указателе ) требовать кол-во аргументов, расправляться ретёрн-вэлью.
Теперь в бой вступает декорирование имён функций. Выбрать явно необходимую функцию компил не может без контекста, а контекст для неявного каста укажет тип лвэлью. В этом мы можем убедиться, написав выражение &f; - напишет, что ему неочевидно. ( если функция имеет не один профиль ). Выход - кастовать. Если у функции нет перегрузок, то компил вполне удачно выведет тип указателя на функции с тем же auto.
То есть, как я это понимаю, это наследие языка Си . И вполне логичное для компилятора. Указатель требует лишь "подчинения" профилю - это и является "типом указателя функции".
Вот пример кода:
#include
void f(int&) { std::cout
Липман, "Язык программирования Си++, базовый курс", у меня стр. 323, "Указатели на перегруженные функции", "...Компилятор использует тип указателя для выявления используемой версии перегруженной функции. Тип указателя должен точно соответствовать одной из версий .."
P.S. Я когда читал, вообще на это внимание не обратил, а сейчас понял - оказывается актуальный вопрос!
Инкапсуляция - это наличие неких уникальных свойств объекта, обеспечивающих возможность обобщить его до некого множества. Иначе, если есть что-то что позволяет говорить о неком наборе данных или наборе функций как о свойствах и методах объекта, если мы можем построить некую хорошо узнаваемую ассоциацию функционального кола с общепринятым устоявшимся гуманитарным понятием, то мы можем осуществить инкапсуляцию. Проще говоря, создание классов объектов и есть инкапсуляция.
не сомневался что в комментах найдется тот кто все знает
Бред.
сбивать ссылку нужно когда мы перегружаем две похожие функции для конст и неконст аргументов и всю реальную логику пишем в конст версии, а в не конст версии мы сначала адаптируем аргумент к конст версии, а потом снимаем конст строгость с результата конст версии и возвращаем результат со сбитым конст. :)
cout