Контакты
Местоположение
Россия, Москва и Московская обл.

Достижения

Все достижения (15)

Наибольший вклад в теги

Все теги (50)

Лучшие ответы пользователя

Все ответы (166)
  • Как присвоить строку перемененной типа char[]?

    char s1[7] = "hello";

    Ошибки:
    1. Строки нужно заключать в двойные кавычки, а символы в одинарные: 'h', но "hello".
    2. Массивы и строки нельзя присваивать. Исключение составляет инициализация.
    Ответ написан
  • Для чего нужны и что делают аллокаторы в С++?

    Аллокатор умеет выделять и освобождать память в требуемых количествах определённым образом. std::allocator -- пример реализации аллокатора из стандартной библиотеки, просто использует new и delete, которые обычно обращаются к системным вызовам malloc и free.

    Более сложный пример -- pool allocator. Раз системные вызовы дороги, почему бы на них не сэкономить? Выделим сразу 1 гигабайт памяти (к примеру), а дальше в аллокаторе будем выдавать память из этого пула и увеличивать указатель head (опять же, упрощенно). Реальное выделение памяти только одно, системных вызовов почти нет, ура-ура, программа ускорилась.

    Собственно, для этого и нужны аллокаторы, чтобы вставлять свое, крутое, нестандартное, выделение памяти в любое место. Большинство стандартных контейнеров их принимают.
    Ответ написан
  • Как изменить тип переменной?

    Не выйдет. C++ статически типизирован, и это то, что позволяет ему работать быстро.
    А зачем, собственно, это понадобилось? В конкретной ситуации можно что-нибудь придумать.
    P.S. Если хочется "просто", стоит оставаться на Питоне :)
    Ответ написан
  • Как понять, как использовать переменные, указатели и ссылки в C++?

    В параметре функции:
    • Если параметр не нужно модифицировать, то передаём по константной ссылке const T&
    • Если к тому же параметр -- это POD размером не более 32 байт, то можно передать по значению T
    • Если параметр нужно модифицировать, то передаём по неконстантной ссылке T&
    • Если параметр может отсутствовать (nullptr), то передаём по указателю T* / const T*. Константность зависит от того, надо ли параметр модифицировать
    • Если нужно скопировать внутрь текущего объекта параметр шаблонного типа, то используем универсальную ссылку T&&


    В возвращаемом значении:
    • Если нужно вернуть результат, вычисленный в функции, возвращаем значение
    • Если нужно вернуть указатель на фиксированную область памяти, возвращаем ссылку / указатель. Различие в использовании и константность подробно описаны выше
    • Если мы хотим передать владение, возвращаем std::unique_ptr


    В поле класса:
    • Почти всегда по значению
    • Указатель указывает на память, которой мы не владеем (не имеем права делать delete). Ссылки нельзя использовать ввиду технических ограничений
    • std::unique_ptr указывает на память, которой мы владеем. Предпочитать значению его следует, если это полиморфный тип


    Замечание 1. Есть типы, перемещение которых дорого или невозможно: большой std::array, std::fstream. Если мы хотим передавать владельца переменной такого типа или, например, вернуть из функции, то придётся использовать std::unique_ptr.

    Замечание 2. "Нужно модифицировать" означает, что мы хотим, чтобы изменения объекта были видны вне функции. Можно и нужно обходиться константной ссылкой, если допустимо скопировать переменную и модифицировать её внутри функции.
    Ответ написан