• Как удалить из строки символы кириллицы?

    master2016
    @master2016
    Всё нормально.
    Символы кириллицы - это наше наследие. И мы никому не позволим их удалять.
    Ответ написан
    Комментировать
  • Для чего нужна перегрузка операторов в классах (STL)?

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    По моему опыту, операторы нужны, если вы используете шаблоны.
    Например, запихните ваши объекты в std::vector и вызовите std::sort(vec.begin(), vec.end());
    В этом случае будет использоваться operator< для того, чтобы отсортировать значения.
    или например, напишите свою функцию
    <template class T>
    T sum3(T t1, T t2, T3) {
       return t1 + t2 + t3;
    }
    
    sum3(MyClass(), MyClass(), MyClass());
    этот код скомпилируется только если вы определите MyClass::operator+.
    Тот же std:: sort может использовать operator() для сравнения объектов, прямо из доков.
    Ну и в таком духе дальше.
    Ответ написан
    2 комментария
  • Как заставить сработать исключение std::bad_alloc?

    @Mercury13
    Программист на «си с крестами» и не только
    #include <iostream>
    #include <conio.h>
    
    int main()
    {
      setlocale(LC_ALL, "Russian");
      const size_t SIZE = 3000000000ul;
      char* ptr = NULL;
      try
      {
        ptr = new char[SIZE];
        std::cout << "Память используется без сбоев.\n";
      }
      catch (std::bad_alloc&)
      {
        std::cout << "Исключение bad_alloc: невозможно разместить данные в памяти.\n";
      }
      delete[] ptr;
      getch();
      return 0;
    }


    Столько кода — и столько ошибок! По пунктам.
    1. Ответ на ваш вопрос. Сделать константу побольше. Кстати, эта константа — size_t. В 64-битном коде надо ещё больше.
    2. Не проработано поведение delete[], если случится ошибка. Покатит инициализация NULL.
    3. Если случится ошибка, будут выведены оба сообщения.
    4. getch — функция из платформозависимого заголовка conio.h. Только DOS/Windows.
    5. Обработку аварий обычно делают по ссылке.
    6. Для первого параметра setlocale надо указывать ненулевую маску, на какие части ставить локаль. LC_ALL — везде. Что писать вторым параметром, зависит от библиотеки времени выполнения.
    Ответ написан
    7 комментариев
  • Стоит ли зацикливаться на непонятной теме?

    @Alexander1705
    У каждой переменной есть адресс в памяти (обычное натуральное число, порядковый номер какого-нибудь байта). Когда создаёте массив, его элементы (по сути, те же переменные) рассполагаются в памяти по-порядку.
    Если вы будете передавать массив по значению, вам придётся передавать функции значение каждого элемента, а их могут быть сотни и тысячи. По этому, вы можете сказать адрес первого элемента, и их количество. Зная, что остальные элементы будут рассполагаться сразу за первым, функция сможет получить доступ ко всем остальным элементам.

    Уточните, если что-то непонятно, или если есть вопросы по синтаксису.

    Upd.
    // Функция, которая принимает массив.
    void foo(int* arr, size_t n)
    {
        for (size_t i = 0; i < n; ++i)
            cout << arr[i] << ' ';
    }
    
    // Функция, которая возвращает массив.
    int* bar(size_t n)
    {
        // Массив должен быть выделен динамически, иначе
        // он перестанет существовать после завершения этой функции.
        int* arr = new int[n];
        for (size_t i = 0; i < n; ++i)
            cin >> arr[i];
    
        return arr;
    }

    Обратите внимание, что если функция возвращает указатель на массив, последний должен быть выделен динамически. Иначе массив будет уничтожен при завершении функции, вы просто получите некорректный указатель и undefined behaviour.

    P.S. Не забывайте удалять динамически выделенные массивы (delete[] arr;), после того, как они станут больше не нужны.
    Ответ написан
    4 комментария
  • Стоит ли зацикливаться на непонятной теме?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Поступайте более гибко. Чуть чуть теории, чуть чуть практики. Не надо бросаться абсолютно все и вся зубрить и заучивать. Пишите! Уверяю, что Вы быстро поймете насколько освоили материал, который только что прочитали, если не откладывая сразу же начнете что-нибудь писать и попытаетесь применить. Программирование это искуство, иногда некоторые логичные вещи по началу не работают и глаза на лоб лезут "А почему?" и наоборот казалось бы тупейший и нелогичный кусок кода почему-то работает.

    чуть-теории - чуть-практики
    Ответ написан
    Комментировать