
- •1.2 Философские замечания
- •1.3 Процедурное программирование
- •1.4 Модульное программирование
- •1.5 Абстракция данных
- •1.6 Пределы абстракции данных
- •1.7 Объектно-ориентированное программирование
- •1.8 Концепции объектно-ориентированного программирования
- •1.8.1 Инкапсуляция
- •1.8.2 Полиморфизм
- •1.8.3 Наследование
- •1.10 Несколько полезных советов
- •2.2 Перегрузка функций
- •2.3 Перегрузка операторов
- •2.4 Наследование
- •2.5 Конструкторы и деструкторы
- •2.7 Два новых типа данных
- •Глава 3. Классы и объекты
- •3.1 Параметризованные конструкторы
- •3.2 Дружественные функции
- •3.3 Значения аргументов функции по умолчанию
- •3.3.1 Корректное использование аргументов по умолчанию
- •3.4 Взаимосвязь классов и структур
- •3.5 Связь объединений и классов
- •3.6 Анонимные объединения
- •3.7 Inline-функции
- •3.7.1 Создание inline-функций внутри класса
- •3.8 Передача объектов в функции
- •3.9 Возвращение объектов функциями
- •3.10 Присваивание объектов
- •3.11 Конструктор копирования
- •3.12 Массивы объектов
- •3.12.1 Инициализация массивов объектов
- •3.12.2 Создание инициализированных и неинициализированных массивов
- •3.13 Указатели на объекты
- •3.14 Статические члены класса
- •Глава 4. Перегрузка функций и операторов
- •4.1 Перегрузка конструкторов
- •4.2 Локализация переменных
- •4.3 Локализация создания объектов
- •4.4 Перегрузка функций и неопределенность
- •4.5 Определение адреса перегруженной функции
- •4.6 Указатель this
- •4.7 Перегрузка операторов
- •4.8 Дружественная функция-оператор
- •4.9 Ссылки
- •4.9.1 Параметры-ссылки
- •4.9.2 Передача ссылок на объекты
- •4.9.3 Возврат ссылок
- •4.9.4 Независимые ссылки
- •4.9.5 Использование ссылок для перегрузки унарных операторов
- •4.10 Перегрузка оператора []
- •4.11 Создание функций преобразования типов
- •Глава 5. Наследование, виртуальные функции и полиморфизм
- •5.1 Наследование и спецификаторы доступа
- •5.1.1 Спецификаторы доступа
- •5.1.2 Спецификатор доступа при наследовании базового класса
- •5.1.3 Дополнительная спецификация доступа при наследовании
- •5.2 Конструкторы и деструкторы производных классов
- •5.3 Множественное наследование
- •5.4 Передача параметров в базовый класс
- •5.5 Указатели и ссылки на производные типы
- •5.6 Ссылки на производные классы
- •5.7 Виртуальные функции
- •5.8 Для чего нужны виртуальные функции?
- •5.9 Чисто виртуальные функции и абстрактные типы
- •5.10 Виртуальный базовый класс
- •5.11 Раннее и позднее связывание
- •Глава 6. Подсистема динамического выделения памяти
- •6.1 Введение в обработку исключений
- •6.1.1 Перехват всех исключений
- •6.2 Работа с памятью с помощью new и delete
- •6.3 Размещение объектов
- •6.4 Перегрузка new u delete
- •7.1.1 Потоки
- •7.3 Создание собственных операторов вставки и извлечения
- •7.3.1 Создание операторов вставки
- •7.3.2 Перегрузка операторов извлечения
- •7.4 Форматирование ввода/вывода
- •7.4.1 Форматирование с помощью функций-членов класса ios
- •7.4.2 Использование манипуляторов
- •7.5 Создание собственных функций-манипуляторов
- •7.5.1 Создание манипуляторов без параметров
- •7.5.2 Создание манипуляторов с параметрами
- •7.6 Файловый ввод/вывод
- •7.6.1 Открытие и закрытие файлов
- •7.6.2 Чтение и запись в текстовые файлы
- •7.6.3 Двоичный ввод/вывод
- •7.6.4 Определение конца файла
- •7.6.5 Произвольный доступ
- •Глава 8. Ввод/вывод в массивы
- •8.1 Классы ввода/вывода в массивы
- •8.2 Создание потока вывода
- •8.3 Ввод из массива
- •8.4 Использование функций-членов класса ios
- •8.5 Потоки ввода/вывода в массивы
- •8.6 Произвольный доступ в массив
- •8.7 Использование динамических массивов
- •8.8 Манипуляторы и ввод/вывод в массив
- •8.9 Собственные операторы извлечения и вставки
- •8.10 Форматирование на основе массивов
- •Глава 9. Шаблоны и библиотека stl
- •9.1 Функции-шаблоны
- •9.2 Функции с двумя типами-шаблонами
- •9.3 Ограничения на функции-шаблоны
- •9.4 Классы-шаблоны
- •9.5 Пример с двумя типами-шаблонами
- •9.6 Обзор библиотеки stl
- •9.7 Класс vector
- •9.7 Класс string
- •9.8 Класс list
2.7 Два новых типа данных
Просматривая список ключевых слов таблицы 2.1, можно заметить добавление двух новых встроенных типов: bool и wchar_t. Тип данных bool предназначен для логических величин. Они могут принимать только два значения - true и false. Значения true и false также являются ключевыми словами и служат частью языка C++. При употреблении логических типов в нелогических выражениях они автоматически преобразуются к типу целых чисел. Хотя C++ определяет тип данных bool, он продолжает полностью поддерживать фундаментальную концепцию о том, что ненулевые целые числа соответствуют значению истина, а нулевое значение соответствует значению ложь.
Тип wchar_t поддерживает широкие символы, обычно являющиеся 16-битовыми значениями. Они обычно используются для представления набора букв в языках, для которых недостаточно 255 символов. Тип wchar_t поддерживается в С путем определения типа с использованием typdef. В C++ этот тип стал ключевым словом.
asm |
inline |
template |
bool |
mutable |
this |
catch |
namespace |
throw |
class |
new |
true |
const_cast |
operator |
try |
delete |
private |
typeid |
dynamic_cast |
protected |
typename |
explicit |
public |
using |
false |
reinterpret_cast |
virtual |
friend |
static_cast |
wchar_t |
Таблица 2.1. Ключевые слова C++
Глава 3. Классы и объекты
3.1 Параметризованные конструкторы
Конструкторам можно передавать аргументы. Обычно эти аргументы используются для того, чтобы помочь инициализировать создаваемый объект. Для того чтобы создать параметризированный конструктор, достаточно попросту добавить параметры, как это делается для любой другой функции. При определении тела конструктора, т.е. кода, который реализует конструктор, эти параметры используются для инициализации объекта. Например, можно усовершенствовать класс queue, рассмотренный в конце предыдущей главы, путем передачи ему в качестве аргумента числа, служащего идентификатором объекта. Объявление класса queue будет иметь следующий вид:
class queue
{
int q[100];
int s, r;
int who; // содержит идентификатор очереди
public:
queue(int id); // параметризированный конструктор
~queue(); // деструктор
void put(int i);
int get();
}
Переменная who используется для хранения значения идентификатора, служащего для идентификации объекта типа queue. Его значение определяется аргументом id при создании объекта. Конструктор queue() будет выглядеть следующим образом:
queue::gueue(int id)
{
s = r = 0;
who = id;
cout << "Queue " << who << " initialized.\n";
}
Для передачи аргумента конструктору необходимо задать его значение при объявлении объекта. C++ поддерживает два способа решения этой задачи. Первый из них выглядит следующим образом:
queue a = queue(101);
Здесь конструктор класса queue вызывается непосредственно с передачей ему значения 101. Значением переменной а служит сам созданный объект.
Второй способ короче и более непосредственно ведет к цели. В этом методе аргумент или аргументы следуют за именем объекта в скобках. Следующая строка кода служит той же самой цели, что и предыдущее объявление объекта:
queue a(101);
Общая форма для передачи аргументов конструктору имеет следующий вид:
тип_класса объект(список_аргументов);
Здесь список_аргументов представляет собой список аргументов, разделенных запятыми. Эти аргументы и передаются конструктору.
Следующая программа демонстрирует передачу аргументов конструктору:
int main()
{
queue a(1), b(2); // создание двух объектов типа queue
a.put(10); a.put(20);
b.put(19); b.put(1);
cout << a.get() << " ";
cout << a.get() << " ";
cout << b.get() << " ";
cout << b.get() << "\n";
return 0;
}
Эта программа выводит следующий текст:
Queue 1 initialized.
Queue 2 initialized.
10 20 19 1
Queue 2 destroyed.
Queue 1 destroyed.
Посмотрев на функцию main(), мы увидим, что объект а имеет в качестве идентификатора 1, а объект b - 2.
Хотя в данном примере при создании объекта ему передается только один аргумент, можно передавать также и несколько аргументов. Например, в следующей программе объектам типа pair передаются два значения:
#include <iostream.h>
class pair
{
int i;
int j;
public:
pair(int a, int b);
void put();
}
pair:: pair(int a, int b)
{
i = a;
j = b;
}
void pair::put()
{
cout << i << " " << j << "\n";
}
int main()
{
pair x(10, 20), y(0, 0);
x.put();
у.put();
return 0;
}
Эта программа выведет на экран значения
10 20
0 0