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

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

На нашем литературном портале можно бесплатно читать книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп, Бьёрн Страуструп . Жанр: Программирование. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале litmir.org.
Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Название: Программирование. Принципы и практика использования C++ Исправленное издание
Дата добавления: 22 август 2024
Количество просмотров: 98
Читать онлайн

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту readbookfedya@gmail.com для удаления материала

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

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

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

1 ... 91 92 93 94 95 ... 337 ВПЕРЕД
Перейти на страницу:
};

  struct Function: Shape { /* ... */ };

  struct Text: Shape { /* ... */ };

  // ...

  int gui_main() { /* ... */ }

}

Очень вероятно, что вы также захотите использовать эти имена, но теперь это уже не имеет значения. Вы можете определить сущность с именем Text, но ее уже невозможно перепутать с нашим классом, имеющим то же имя. Наш класс называется Graph_lib::Text, а ваш класс — просто Text. Проблема возникнет только в том случае, если в вашей программе есть класс или пространство имен Graph_lib, в которое входит класс Text. Имя Graph_lib довольно неудачное; мы выбрали его потому, что “прекрасное и очевидное” имя Graphics имеет больше шансов встретиться где-нибудь еще.

Допустим, ваш класс Text является частью библиотеки для обработки текстов. Та же логика, которая заставила нас разместить графические средства в пространстве имен Graph_lib, подсказывает, что средства для обработки текстов следует поместить в пространстве имен, скажем, с именем TextLib.

namespace TextLib {

  class Text { /* ... */ };

  class Glyph { /* ... */ };

  class Line { /* ... */ };

  // ...

}

Если бы мы использовали оба пространства имен одновременно, то столкнулись бы с реальной проблемой. В этом случае действительно возникла бы коллизия между именами классов Text и Line. И что еще хуже, если бы мы были не создателями, а пользователями библиотеки, то не никак не смогли бы изменить эти имена и решить проблему. Использование пространств имен позволяет избежать проблем; иначе говоря, наш класс Text — это класс Graph_lib::Text, а ваш — TextLib::Text. Имя, составленное из имени пространства имен (или имени класса) и имени члена с помощью двух двоеточий, ::, называют полностью определенным именем (fully qualified name).

8.7.1. Объявления using и директивы using

Писать полностью определенные имена довольно утомительно. Например, средства стандартной библиотеки языка С++ определены в пространстве имен std и могут использоваться примерно так:

#include<string>   // доступ к библиотеке string

#include<iostream> // доступ к библиотеке iostream

int main()

{

  std::string name;

  std::cout << " Пожалуйста, введите имя n";

  std::cin >> name;

  std::cout << " Привет, " << name << 'n';

}

Тысячи раз обращаясь к элементам стандартной библиотеки string и cout, мы на самом деле вовсе не хотим каждый раз указывать их полностью определенные имена — std::string и std::cout. Напрашивается решение: один раз и навсегда указать, что под классом string мы имеем в виду класс std::string, а под потоком cout — поток std::cout и т.д.

using std::string; // string означает std::string

using std::cout;   // cout означает std::cout

// ...

Эта конструкция называется объявлением using. Она эквивалентна обращению “Грэг”, которое относится к Грэгу Хансену при условии, что никаких других Грэгов в комнате нет.

Иногда мы предпочитаем ссылаться на пространство имен еще “короче”: “Если вы не видите объявления имени в области видимости, ищите в пространстве имен std”. Для того чтобы сделать это, используется директива using.

using namespace std; // открывает доступ к именам из пространства std

Эта конструкция стала общепринятой.

#include<string>     // доступ к библиотеке string

#include<iostream>   // доступ к библиотеке iostream

using namespace std; // открывает доступ к именам из пространства std

int main()

{

  string name;

  cout << "Пожалуйста, введите имя n";

  cin >> name;

  cout << "Привет, " << name << 'n';

}

Здесь поток cin — это поток std::cin, класс string это класс std::string и т.д. Поскольку мы используем заголовочный файл std_lib_facilities.h, не стоит беспокоиться о стандартных заголовках и пространстве имен std. Мы рекомендуем избегать использования директивы using для любых пространств имен, за исключением тех из них, которые широко известны в конкретной области приложения, например пространства имен std. Проблема, связанная с чрезмерным использованием директивы using, заключается в том, что мы теряем след имен и рискуем создать коллизию. Явная квалификация с помощью соответствующих имен пространств имен и объявлений using не решает эту проблему. Итак, размещение директивы using в заголовочный файл (куда пользователю нет доступа) — плохая привычка. Однако, для того чтобы упростить первоначальный код, мы разместили директиву using для пространства имен std в заголовочном файле std_lib_facilities.h. Это позволило нам написать следующий код:

#include "std_lib_facilities.h"

int main()

{

  string name;

  cout << "Пожалуйста, введите имя n";

  cin >> name;

  cout << "Привет, " << name << 'n';

}

Мы обещаем больше никогда так не делать, если речь не идет о пространстве имен std.

Задание

• Создайте три файла: my.h, my.cpp и use.cpp. Заголовочный файл my.h содержит следующий код:

extern int foo;

void print_foo();

void print(int);

Исходный файл my.cpp содержит директивы #include для вставки файлов my.h и std_lib_facilities.h, определение функции print_foo() для вывода значения переменной foo в поток cout и определение функции print(int i) для вывода в поток cout значения переменной i.

Исходный файл use.cpp содержит директивы #include для вставки файла my.h, определение функции main() для присвоения переменной foo значения 7 и вывода ее на печать с помощью функции print_foo(), а также для вывода значения 99 с помощью функции print(). Обратите внимание на то, что файл use.cpp не содержит директивы #include std_lib_facilities.h, поскольку он не использует явно ни одну из его сущностей.

Скомпилируйте эти файлы и запустите их. Для того чтобы увидеть результаты вывода на печать в системе Windows, в проект следует включить функции use.cpp и my.cpp и использовать в файле use.cpp код { char cc; cin>>cc; }.

2. Напишите три функции: swap_v(int,int), swap_r(int&,int&) и swap_cr(const int&,const int&). Каждая из

1 ... 91 92 93 94 95 ... 337 ВПЕРЕД
Перейти на страницу:
Комментариев (0)