uk
Feedback
C++ geek

C++ geek

Відкрити в Telegram

Учим C/C++ на примерах

Показати більше
3 540
Підписники
-224 години
-177 днів
-2930 день
Архів дописів
В чем разница между struct и class? Ответ: Практически ни в чем. В struct модификаторы доступа по умолчанию public, в class p
В чем разница между struct и class? Ответ: Практически ни в чем. В struct модификаторы доступа по умолчанию public, в class private. Также отличается и наследование по умолчанию, у struct — public, у class — private. ➡️ @cpp_geek

this удобно использовать для цепочных вызовов Мы можем вернуть ссылку на объект, на котором мы вызываем метод класса: Foo &set(int x) { this->x = x; return *this; } Здесь метод set возвращает ссылку на объект класса Foo(Foo&). Такая реализация метода позволяет нам писать код, подобный этому: obj.set(2).set(8); Это возможно, поскольку первый вызов метода set возвращает указатель на объект obj. Второй метод вызывается на объекте obj, т. е. можно переписать код так: obj = obj.set(2); obj = obj.set(8); ➡️ @cpp_geek

Макрос watch Макрос watch — один из самых полезных приёмов. При отладке кода watch(переменная) выведет имя переменной и её зн
Макрос watch Макрос watch — один из самых полезных приёмов. При отладке кода watch(переменная) выведет имя переменной и её значение. ➡️ @cpp_geek

Кортежи Как и пара, кортеж представляет собой набор значений фиксированного размера для различных типов данных. Иногда удобне
Кортежи Как и пара, кортеж представляет собой набор значений фиксированного размера для различных типов данных. Иногда удобнее использовать std::array вместо кортежа. Такой массив подобен обычному массиву в Си вместе с несколькими функциями стандартной библиотеки C++. Эта структура данных была добавлена в 11 версии C++. ➡️ @cpp_geek

Что такое класс хранения? Класс, который определяет срок существования, компоновку и расположение переменных/функций в памяти. В C ++ поддерживаются такие классы хранения: auto, static, register, extern и mutable. Обратите внимание, что register устарел для C++11. Для C++17 он был удален и зарезервирован для будущего использования. ➡️ @cpp_geek

Инициализатор в if и switch Вам должна понравиться такая возможность из С++17. Теперь вы можете выполнять инициализацию перем
Инициализатор в if и switch Вам должна понравиться такая возможность из С++17. Теперь вы можете выполнять инициализацию переменных и проверять условие внутри if или switch. Это даёт сделать код более лаконичным и чистым. Общая форма: if (init-statement(x); condition(x)) { // some code } else { // в else тоже видно x // some more code } ➡️ @cpp_geek

nullptr Раньше, для обнуления указателей использовался макрос NULL, являющийся нулем — целым типом, что, естественно, вызывал
nullptr Раньше, для обнуления указателей использовался макрос NULL, являющийся нулем — целым типом, что, естественно, вызывало проблемы (например, при перегрузке функций). Ключевое слово nullptr имеет свой собственный тип std::nullptr_t, что избавляет нас от бывших проблем. Существуют неявные преобразования nullptr к нулевому указателю любого типа и к bool (как false), но преобразования к целочисленных типам нет. ➡️ @cpp_geek

Что за оператор −−> в С++? Это старый хитрый вопрос. В С++ нет оператора −−>. Рассмотрим такой код: if (p−−>m == 0) f(p); Выглядит так, как будто и правда есть оператор −−>, и если правильно объявить переменные p и m, то код даже скомпилируется и запустится: int p = 2; int m = 0; if (p−−>m == 0) f(p); Это означает: если p−− больше чем m (а это так), то надо сравнить результат (true) с нулём. Ну, true != 0, так что результат всего выражения — false, и функция f() не вызовется. Другими словами: if ((p−−) > m == 0) f(p); Пожалуйста, не тратьте много времени на подобные вопросы. Они сбивали с толку новичков ещё до того, как появился С++. ➡️ @cpp_geek

Cтрого-типизированный enum У «традиционных» перечислений в С++ есть некоторые недостатки: они экспортируют свои значения в ок
Cтрого-типизированный enum У «традиционных» перечислений в С++ есть некоторые недостатки: они экспортируют свои значения в окружающую область видимости (что может привести к конфликту имен), они неявно преобразовываются в целый тип и не могут иметь определенный пользователем тип. Эти проблемы устранены в С++11 с введением новой категории перечислений, названных strongly-typed enums. Они определяются ключевым словом enum class. Они больше не экспортируют свои перечисляемые значения в окружающую область видимости, больше не преобразуются неявно в целый тип и могут иметь определенный пользователем тип (эта опция так же добавлена и для «традиционных» перечислений"). ➡️ @cpp_geek

Функция all_of Эта функция работает со всем диапазоном элементов массива и может сэкономить время на запуск цикла для проверк
Функция all_of Эта функция работает со всем диапазоном элементов массива и может сэкономить время на запуск цикла для проверки каждого элемента по одному. Она проверяет заданное свойство для каждого элемента и возвращает true, когда каждый элемент в диапазоне удовлетворяет указанному свойству, иначе возвращает false. В приведенном выше коде отрицательный элемент -6 отрицает условие и возвращает false. ➡️ @cpp_geek

init внутри if и switch Эта возможность C++17 мне полюбилась сразу же, как только я узнал о ней. Теперь вы можете инициализир
init внутри if и switch Эта возможность C++17 мне полюбилась сразу же, как только я узнал о ней. Теперь вы можете инициализировать переменные и проверять условия сразу же внутри блоков if и switch. Это помогает сохранять код понятным и чистым. ➡️ @cpp_geek

В С++11 появилась такая классная штука, как цикл for, основанный на диапазоне. Например, вам не придётся писать for (int i =
В С++11 появилась такая классная штука, как цикл for, основанный на диапазоне. Например, вам не придётся писать for (int i = 0; i < v.size(); i++), потому что теперь есть for (auto &e : v). Он очень полезен при обходе std::set или std::map. ➡️ @cpp_geek

В чем разница между указателем и ссылкой в C++? Указатель может быть переназначен n-раз, в то время как ссылка не может быть переназначена после бинда. Указатели могут указывать в NULL, тогда как ссылка всегда ссылается на объект. Программист не может получить адрес ссылки, как это возможно с указателями, но можно взять адрес объекта, на который указывает ссылка, и выполнить действия с ним. ➡️ @cpp_geek

Могут ли статичные функции быть виртуальными в С++? В C++ статическая функция-член класса не может быть виртуальной. Виртуаль
Могут ли статичные функции быть виртуальными в С++? В C++ статическая функция-член класса не может быть виртуальной. Виртуальные функции вызываются, когда у вас есть указатель или ссылка на экземпляр класса. Статические функции не привязаны к экземпляру класса, но они привязаны к самому классу. C++ не имеет указателей на класс, поэтому нет сценария, в котором вы могли бы виртуально вызвать статическую функцию. Например, программа с картинки в примере 1 выдаст ошибку во время компиляции. Кроме того, статическая функция-член класса не может иметь одновременно идентификаторы const и volatile. Код из примера 2 тоже не скомпилируется. ➡️ @cpp_geek

forward_list::unique() в C++ STL forward_list::unique() — это встроенная функция в C++ STL, которая удаляет все последователь
forward_list::unique() в C++ STL forward_list::unique() — это встроенная функция в C++ STL, которая удаляет все последовательные повторяющиеся элементы из forward_list. Для сравнения используется бинарный предикат. ➡️ @cpp_geek

Бесконечный цикл Для чего? Когда while(true), while(1), for(;;) и прочие стандартные пути создания цикла кажутся не слишком и
Бесконечный цикл Для чего? Когда while(true), while(1), for(;;) и прочие стандартные пути создания цикла кажутся не слишком информативными, можно использовать подобный макрос. Единственный плюс который он дает — чуть лучшую читаемость кода. ➡️ @cpp_geek

В чем отличие malloc от new? Ответ: malloc — выделение блока памяти в стиле Си, опасное с точки зрения приведения типов (non-typesafe), т.к. возвращает void * и требует обязательного приведения. new — выделение блока памяти и последующий вызов конструктора, безопасное с точки зрения приведения типов (typesafe), т.к. тип возвращаемого значения определен заранее. ➡️ @cpp_geek

Неиспользуемые переменные Подобный макрос есть, например, в cocos2d-x, там он называется CC_UNUSED_PARAM. Из недостатков: тео
Неиспользуемые переменные Подобный макрос есть, например, в cocos2d-x, там он называется CC_UNUSED_PARAM. Из недостатков: теоретически, он может работать не на всех компиляторах. Тем не менее, в cocos2d-x он для всех платформ определен абсолютно одинаково. Для чего? Этот макрос позволяет избежать предупреждения о неиспользуемой переменной, а читающему код он как бы говорит: «тот кто писал это — знал, что переменная не используется, все в порядке». ➡️ @cpp_geek

Объединения тоже могут быть шаблонами Еще одна вещь, о которой знают немногие, это то, что объединения тоже могут быть шаблон
Объединения тоже могут быть шаблонами Еще одна вещь, о которой знают немногие, это то, что объединения тоже могут быть шаблонами. У них также могут быть конструкторы и функции-члены. Ничего общего с наследованием (включая виртуальные функции). ➡️ @cpp_geek

Корень числа Дано действительное число a и натуральное n. Вычислите корень n-й степени из числа a, используя вещественный бин
Корень числа Дано действительное число a и натуральное n. Вычислите корень n-й степени из числа a, используя вещественный бинарный поиск. Формат входных данных: С клавиатуры через пробел вводится два числа: 1. a – действительное, неотрицательное, не превосходит 1000, задано с точностью до 6 знаков после десятичной точки; 2. n – натуральное, не превосходящее 10. Формат выходных данных: Требуется вывести число с точностью не менее 6 знаков после запятой. ➡️ @cpp_geek