LoveRead.info » Книги » Разная литература » Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

288 0 18:03, 26-08-2023
Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
26 август 2023

Книга Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читать онлайн бесплатно без регистрации

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

    1 ... 295 296 297 298 299 300 301 302 303 ... 337
    Перейти на страницу:
    преобразование указателя типа T* в указатель типа void* является совершенно безопасным, — вы не сможете придумать ужасные примеры, подобные предыдущему, — и они допускаются как в языке C, так и в языке C++.

    К сожалению, неявное преобразование void* в T* широко распространено в языке C и, вероятно, является основной проблемой совместимости языков С и С++ в реальных программах (см. раздел 27.4).

    27.3.6. Перечисление

    В языке C можно присваивать целое число перечислению без приведения int в enum. Рассмотрим пример.

    enum color { red, blue, green };

    int x = green;      /* OK в языках C и C++ */

    enum color col = 7; /* OK в языке C; ошибка в языке C++ */

    Одним из следствий этого факта является то, что в программах на языке С мы можем применять операции инкрементации (++) и декрементации (––) к переменным, являющимся перечислениями. Это может быть удобным, но одновременно небезопасным.

    enum color x = blue;

    ++x; /* переменная x становится равной значению green;

            ошибка в языке C++ */

    ++x; /* переменная x становится равной 3; ошибка в языке C++ */

    Выход за пределы перечисления может входить в наши планы, а может быть неожиданным.

    Обратите внимание на то, что, подобно дескрипторам структур, имена перечислений пребывают в своем собственном пространстве имен, поэтому каждый раз при указании имени перечисления перед ним следует ставить ключевое слово enum.

    color c2 = blue;     /* ошибка в языке C: переменная color не находится

                            в пределах области видимости; OK в языке C++ */

    enum color c3 = red; /* OK */

    27.3.7. Пространства имен

    В языке С нет пространств имен (в том смысле, как это принято в языке С++). Так что же можно сделать, чтобы избежать коллизий имен в больших программах, написанных на языке С? Как правило, для этого используются префиксы и суффиксы. Рассмотрим пример.

    /* в bs.h: */

    typedef struct bs_string { /* ... */ } bs_string; /* строка

                                                         Бьярне */

    typedef int bs_bool; /* булев тип Бьярне */

    /* in pete.h: */

    typedef char* pete_string; /* строка Пита */

    typedef char pete_bool;    /* булев тип Пита */

    Этот прием настолько широко используется, что использовать одно- и двухбуквенные префиксы обычно уже недостаточно.

    27.4. Свободная память

     В языке С нет операторов new и delete, работающих с объектами. Для использования свободной памяти в нем используются функции, работающие с памятью. Наиболее важные функции определены в стандартном заголовочном файле общих утилит <stdlib.h>.

    void* malloc(size_t sz); /* выделить sz байтов */

    void free(void* p);      /* освободить область памяти, на которую

                                ссылается указатель p */

    void* calloc(size_t n, size_t sz); /* выделить n*sz байтов,

                                          инициализировав их нулями */

    void* realloc(void* p, size_t sz); /* вновь выделить sz байтов

                                          в памяти, на которую ссылается

                                          указатель p*/

    Тип typedef size_t — это тип без знака, также определенный в заголовочном файле <stdlib.h>.

     

     Почему функция malloc() возвращает указатель void*? Потому что она не имеет информации о том, объект какого типа вы хотите разместить в памяти. Инициализация — это ваша проблема. Рассмотрим пример.

    struct Pair {

      const char* p;

      int val;

    };

    struct Pair p2 = {"apple",78};

    struct Pair* pp = (struct Pair*) malloc(sizeof(Pair)); /* выделить память */

    pp–>p = "pear"; /* инициализировать */

    pp–>val = 42;

    Теперь мы не можем написать инструкцию

    *pp = {"pear", 42}; /* ошибка: не C и не C++98 */

    ни в программе на языке C, ни в программе на языке C++. Однако в языке С++ мы могли бы определить конструктор для структуры Pair и написать инструкцию Pair* pp = new Pair("pear", 42);

    В языке C (но не в языке C++; см. раздел 27.3.4) перед вызовом функции malloc() можно не указывать приведение типа, но мы не рекомендуем это делать.

    int* p = malloc(sizeof(int)*n); /* избегайте этого */

    Игнорирование приведения довольно часто встречается в программах, потому что это экономит время и позволяет выявить редкую ошибку, когда программист забывает включить в текст программы заголовочный файл <stdlib.h> перед использованием функции malloc(). Однако при этом исчезает и визуальный маркер, свидетельствующий о том, что размер памяти подсчитан неправильно.

    p = malloc(sizeof(char)*m); /* вероятно, ошибка — нет места для m целых */

     

     Не используйте функции malloc()/free() в программах, написанных на языке C++; операторы new/delete не требуют приведения типа, выполняют инициализацию (вызывая конструкторы) и очищают память (вызывая деструкторы), сообщают об ошибках, связанных с распределением памяти (с помощью исключений), и просто работают быстрее. Не удаляйте объект, размещенный в памяти с помощью функции malloc(), выполняя оператор delete, и не удаляйте объект, созданный с помощью оператора new, вызывая функцию free(). Рассмотрим пример.

    int* p = new int[200];

    // ...

    free(p); // ошибка

    X* q = (X*)malloc(n*sizeof(X));

    // ...

    delete q; // error

    Этот код может оказаться вполне работоспособным, но он не является переносимым. Более того, для объектов, имеющих конструкторы и деструкторы, смешение стилей языков C и C++ при управлении свободной памятью может привести к катастрофе. Для расширения буферов обычно используется функция realloc().

    int max = 1000;

    int count = 0;

    int c;

    char* p = (char*)malloc(max);

    while ((c=getchar())!=EOF) { /* чтение: игнорируются символы

                                    в конце файла */

      if (count==max–1) {        /* необходимо расширить буфер */

        max += max;              /* удвоить размер буфера */

        p = (char*)realloc(p,max);

        if (p==0) quit();

      }

      p[count++] = c;

    }

    Объяснения операторов ввода в языке С приведены в разделах 27.6.2 и Б.10.2.

     

     Функция realloc() может выделить память на
    1 ... 295 296 297 298 299 300 301 302 303 ... 337
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

    Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


    Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

    • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
    • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
    • 3. Просьба отказаться от нецензурной лексики.
    • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

    Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.


    Установить VPN и читай слушай бесплатно

    Новые отзывы

    1. Людмила Хофман Людмила Хофман10 июнь 22:13 У меня перевернулся мир после прочтения ваших книг! Так приятно и чисто на душе, ведь по сути неважно кто с кем , а только любовь... Долгая игра - Рейчел Рид
    2. Анна Анна08 июнь 11:28 Спасибо за новую историю жизни и любви на сайте,прочитала с удовольствием .... Давай поженимся - Юлия Резник
    3. Елена Елена08 июнь 11:13 Прочла несколько романов этого, без сомнения, талантливого автора. Впечатление прекрасное, но хотелось бы когда-нибудь прочесть... Предатель. Ты врал мне годами - Арина Арская
    Все комметарии
    Новинки бесплатной онлайн библиотеки