Программирование. Принципы и практика использования C++ Исправленное издание, стр. 414
// может быть, что-то ещеint x = 'x';printf("hello, world!");printf("print a char '%c'\n",x); // печатает целое число x как // символprintf("print a string \"%s\"",x); // "выстрел себе в ногу"Спецификаторы формата в форматной строке, такие как
%c%sA.9.4. Спецификации связей
Код на языке С++ часто используется наряду с кодом на языке С в одной и той же программе; иначе говоря, одни части бывают написаны на языке С++ (и скомпилированы с помощью компилятора языка С++), а другие — на языке С (и скомпилированы с помощью компилятора языка С). Для того чтобы воспользоваться этой возможностью, язык С++ предлагает программистам спецификации связей (linkage specifications), указывающие, что та или иная функция может быть вызвана из модуля, написанного на языке С. Спецификацию связи с языком С можно поместить перед объявлением функции.
extern "C" void callable_from_C(int);В качестве альтернативы ее можно применить ко всем объявлениям в блоке.
extern "C" {void callable_from_C(int);int and_this_one_also(double, int*);/* ... */}Детали можно найти в разделе 27.2.3.
В языке С нет возможности перегружать функции, поэтому можете поместить спецификацию связи с языком С только в одной версии перегруженной функции.
A.10. Типы, определенные пользователем
Есть два способа определить новый (пользовательский) тип: в виде класса (
classstructunionenumA.10.1. Перегрузка операций
Программист может определить смысл большинства операторов, принимающих операнды пользовательского типа. Изменить стандартный смысл операторов для встроенных типов или ввести новый оператор невозможно. Имя оператора, определенного пользователем (перегруженного оператора), состоит из символа оператора, которому предшествует ключевое слово
operator+operator +Matrix operator+(const Matrix&, const Matrix&);Примеры можно найти в определениях классов
std::ostreamstd::vectorstd::complexMatrixПерегрузить можно все операторы за исключением следующих:
?: . .* :: sizeof typeidФункции, определяющие следующие операторы, должны быть членами класса:
= [ ] ( ) –>Все остальные операторы можно определить и как члены-функции, и как самостоятельные функции.
Обратите внимание на то, что каждый пользовательский тип имеет оператор
=&,При перегрузке операторов следует проявлять умеренность и придерживаться общепринятых соглашений.
A.11. Перечисления
Перечисление (enumeration) определяет тип, содержащий набор именованных значения (перечислителей).
enum Color { green, yellow, red };По умолчанию первый перечислитель равен нулю
0green==0yellow==1red==2enum Day { Monday=1,Tuesday,Wednesday };Итак,
Monday==1Tuesday==2Wednesday==3Отметим, что перечислители принадлежат не области видимости своего перечисления, а охватывающей области видимости.
int x = green; // OKint y = Color::green; // ошибкаПеречислители и значения перечислений неявно преобразовываются в целые числа, но целые числа не преобразовываются в типы перечислений неявно.
int x = green; // OK: неявное преобразование Color в intColor c = green; // OKc = 2; // ошибка: нет неявного преобразования // int в Colorc = Color(2); // OK: (непроверяемое) явное преобразованиеint y = c; // OK: неявное преобразование Color в intИспользование перечислений обсуждается в разделе 9.5.
A.12. Классы
Класс (class) — это тип, для которого пользователь определил представление его объектов и операции, допустимые для этих объектов.
class X {public: // пользовательский интерфейсprivate: // реализация};Переменные, функции и типы, определенные в объявлении класса, называются членами этого класса. Технические детали изложены в главе 9.