- •Введение. Принципы объектно-ориентированного программирования
- •Глава 1. Классы и объекты
- •1.1. Операция разрешения области видимости ::
- •1.2. Перечислимый тип
- •1.3. Модификатор const
- •1.4. Новый тип данных – ссылка &
- •Inline определение_функции
- •2. Определение класса. Сокрытие информации.
- •3. Объект.
- •4. Конструкторы и деструкторы
- •4.1.Назначение конструктора
- •4.2. Конструктор копирования
- •X::X(X&); // где X – имя класса
- •4.3. Деструктор
- •5. Неявный указатель this
- •6. Перегрузка операций
- •7. Примеры перегрузки некоторых операций
- •7.1. Перегрузка операции [ ]
- •7.2. Перегрузка операции ()
- •7.6. Перегрузка операции (тип)
- •8. Дружественность
- •Istream
- •10. Массивы объектов.
- •11. Функции- и классы-шаблоны
- •11.1 Функции-шаблоны (родовые функции)
- •11.2 Классы-шаблоны
- •12. Член-данные класса – объекты другого класса: агрегированные классы.
- •Глава 2. Наследование. Полиморфизм
- •1. Базовый и порожденный классы
- •2. Конструкторы порожденного класса
- •3. Стандартные преобразования при наследовании
- •4. Множественное наследование. Виртуальный базовый класс
- •4.1. Прямые базовые классы
- •4.2. Виртуальный базовый класс
- •5. Полиморфизм, раннее и позднее связывание, виртуальные функции
- •5.1 Раннее (статическое) и позднее (динамическое) связывание
- •5.2. Определение виртуальной функции
- •5.3. Чистая виртуальная функция и абстрактный класс
- •5.4. Правила определения виртуальных функций
- •5.5. Механизм позднего связывания
- •6. Библиотека fstream – работа с файлами
- •Глава 3. Библиотека стандартных шаблонов (бсш). Контейнеры
- •1. Контейнер. Структура бсш.
- •2. Контейнер Vector – динамический массив
- •Контейнер list – список
- •4. Контейнер Set – множество
- •Содержание
- •Глава 1. Классы и объекты
- •Глава 2. Наследование. Полиморфизм
- •Глава 3. Библиотека стандартных шаблонов (бсш). Контейнеры
Istream
В классе istream определена перегруженная операция >> для базовых типов данных
class istream{ ...
public:
istream & operator >> (char *);
istream & operator >> (char &);
istream & operator >> (int &);
istream & operator >> (long int &);
istream & operator >> (float &);
istream & operator >> (double &);
.....
};
Имеется определение стандартного имени cin:
istream cin;
Если определить переменную
Int x;
то операция
cin >> x;
означает, что введенное число со стандартного устройства ввода передается в переменную x. В этой операции cin – первый операнд, x – второй операнд.
Также можно писать цепочки ввода
Int x; float d; char c;
Цепочка ввода
cin >> x >> d >> c;
Это последовательное применение операции >> с аргументами разного типа:
int & float & char &
((cin.operator>>( x )).operator>>( d )).operator>>( c );
cin
cin
cin
По той же причине, что и для операции <<, операция >> может быть перегружена только как дружественная абстрактному классу.
Приведем перегрузку операции ввода для класса String.
class String{
....
public:
...
friend istream & operator >> (istream & r, String & s)
{ char buf[80];
cout << ”\nВведите строку, в конце Enter”;
gets(buf); // r >> buf;
String q(buf);
s = q;
return r;
}
};
Использование
String s1, s2(30);
cin >> s1 >> s2;
Замечание. У второго аргумента операции вывода << тип ссылка & желателен (чтобы не выполнялось копирование), но не обязателен, а у операции ввода >> аргумент обязательно должен иметь тип & – ссылка, иначе значение фактического аргумента после ввода останется без изменения.
10. Массивы объектов.
Массивы объектов определяются обычным образом:
String s[3]; // 3 объекта в статической области, каждый захватывает память
// конструктором по умолчанию по 80 байтов для пустой строки
Объекты, составляющие массив, инициализируются конструктором c аргументами каждый по отдельности, например
String s1[3] = {String(“Иванов”), String(“Петров”)};
Если аргумент один, как в примере, то запись можно сократить.
String s1[3] = {“Иванов”, ”Петров”}; // обратите внимание: элемент s1[2] инициализируется
// по умолчанию пустой строкой
Конструкторы можно комбинировать:
String ss[3] = {12, 20, “С++”};
Можно определить динамический массив:
String *sp = new String[4]; // массив из 4 объектов в динамической области: для каждого объекта
// память для поля line также берется в динамической области
// конструктором по умолчанию по 80 байтов
Запомните! Нельзя явно инициализировать массив объектов, определенных в динамической области. Для таких случаев должен быть предусмотрен конструктор по умолчанию.
String *sp = new String [3] = {“Нельзя ”, “ так ”, “ инициализировать! ”}; // Да, так нельзя!!!
Использование массивов:
s1[1].Print(); // вывод ”Петров”
sp[0] = ss[2]; // работает перегруженная операция ‘=’ : sp[0] = ”C++”
s1[1] [0]=’В’; // ‘Петров’ превратится в ‘Ветров’
станд. перегруженная
s[0] = s1[0] + s1[0]; // вместо пустой строки s[0] = “ИвановИванов”
При выходе из функции память для массивов s, s1 и ss будет освобождаться в 2 этапа:
сначала деструктором класса String для каждого элемента,
затем стандартным деструктором от локальных полей len, line.
Однако для массива объектов, определенного в динамической области, надо явно освободить память при выходе из функции
delete[]sp;
В этом случае освобождение происходит в 3 этапа:
деструктором класса String,
операцией delete от полей line и len каждого элемента массива:
стандартным деструктором от поля sp.
Если этот оператор не задать, то будет освобождена память только от ячейки sp.
Не забывайте этого – берегите память!
