
- •Изучаемые понятия
- •Буквы и цифры
- •Пробельные символы
- •Знаки пунктуации и специальные символы
- •Операции
- •Константы
- •Целые константы
- •Константы с плавающей точкой
- •Константа-символ
- •Строковые литералы
- •Идентификаторы
- •Ключевые слова
- •Комментарии
- •Лексемы
- •Исходные тексты примеров
- •Конструкции принятия решений и циклы вопросы и ответы
- •Структура программы
- •Исходная программа
- •Объявления
- •Спецификаторы типов
- •Деклараторы
- •Деклараторы массивов, функций и указателей
- •Составные деклараторы
- •Об"явления переменной
- •Объявление простой переменной
- •Объявление перечисления
- •Объявления структур
- •Битовые поля
- •Об"явление совмещений
- •Об"явление массива
- •Об"явление функций
- •Классы памяти
- •Об"явления переменной на внешнем уровне
- •Об"явление переменной на внутреннем уровне
- •Об"явление функции на внешнем и внутреннем уровнях
- •Инициализация
- •Базовые типы и типы указателей
- •Составные типы
- •Строковые инициализаторы
- •Об"явления типов
- •Типы структур, совмещений и перечислений
- •Об"явления typedef
- •Имена типов
- •Контрольные вопросы:
- •Функции Объявление и определение функций
- •Типовые вопросы с ответами
- •Практикум Контрольные вопросы
- •Массивы
- •Сортировка массива - пример в файле list6_4cpp.
- •Поиск в массиве
- •Библиотечные функции поиска и сортировки в непрерывных массивах:
- •Строки и управление вводом/выводом
- •Форматированный потоковый вывод
- •Листинг 1. Исходный текст программы out1.Cpp
- •Функция printf
- •Функция printf
- •Листинг 3. Исходный текст программы out2.Cpp в файле List7-3.Cpp
- •Ввод строк
- •Функция getline
- •Присвоение значений строкам
- •Определение длины строки
- •Функция strlen
- •Функция strcat
- •Функция strncat
- •Сравнение строк
- •Функция strcmp
- •(См. List7_5.Cpp - Исходный текст программы string2.Cpp)
- •Поиск символов
- •Функция strchr
- •Функция strrchr
- •Основы объектно-ориентированного программирования синтаксис основных конструкций Объявление базовых классов
- •Конструкторы
- •Деструкторы
- •Объявление иерархии классов
- •Виртуальные функции
- •Дружественные функции
- •Операции и дружественные операции
- •Виртуальные функции
- •Правило виртуальной функции
- •Операции и дружественные операции
- •Исходные тексты примеров
- •Вопросы и ответы
- •Контрольные вопросы
- •Файловые операции ввода/вывода
- •Общие функции потокового ввода/вывода
- •Функция-компонент open
- •Функция-компонент close
- •Последовательный текстовый поток ввода/вывода
- •Функция-элемент getline
- •Листинг 10.1. Исходный код программы trim.Cpp
- •Последовательный двоичный файловый ввод/вывод
- •Функция-элемент write
- •Функция-элемент read
- •Листинг 10.2. Исходный код программы array.Cpp
- •Файловый ввод/вывод с прямым доступом
- •Функция-элемент seekg
- •Заключение
- •Вопросы и ответы
- •Как написать процедуру общего назначения для копирования между входным ивыходным файловым потоком?
- •Практикум Контрольные вопросы
- •Упражнение
Вопросы и ответы
Что случится, если я объявлю конструктор по умолчанию, конструктор копии и другие конструкторы в защищенной области?
Программы, использующие ваш класс, не смогут создавать объекты этого класса. Однако они смогут объявлять классы-потомки с открытыми конструкторами.
Могу я задать цепочку вызовов функций-элементов ?
Да, можете, только если указанные в цепочке функции-элементы возвращают ссылку на тот же самый класс. Например, если в классе String объявлены следующие функции-элементы:
String& upperCase();
String& reverse();
Stringa mapChar(char find, char replace);
вы можете написать следующий оператор обработки объекта класса
String:
s.upperCase().reverse().mapChar(' ', '+');
Что может случиться, если класс полагается на конструктор копии, созданный компилятором, и при этом класс использует указатели в качестве элементов-данных?
Эти конструкторы выполняют побитовую копию объекта. Следовательно, соответствующие элементы-указатели в обоих объектах будут ссылаться на те же самые динамические данные. Этот способ создания копии объекта - верный путь к различным неприятностям.
Могу ли я создавать массив объектов?
Да, можете. Однако соответствующий класс должен иметь заданный по умолчанию конструктор. При создании массива используется ранее упомянутый конструктор.
Могу ли я использовать указатель при создании объекта класса?
Да, можете, но в этом случае вы должны использовать операции new и delete, чтобы распределять и освобождать память для данного объекта.
Вот пример, использующий класс Complex. Не забудьте, что для обращения к элементам классов или структур используется операция ->, если вы ссылаетесь на них при помощи указателей.
Complex *pC;
pC = new Complex;
// операции с объектом, к которому обращаются по указателю pC
delete pC;
или
Complex *pC = new Complex;
// операции с объектом, к которому обращаются по указателю pC
delete pC;
Контрольные вопросы
1. Найдите ошибку в следующем объявлении класса:
class String {
char *str;
unsigned len;
String ();
String(const String& s);
String(unsigned size, char = ' ');
String(unsigned size);
String& assign(String& s);
~String();
unsigned getLen() const;
char* getString();
// другие функции-элементы
};
2. Найдите ошибку в следующем объявлении класса:
class String {
protected:
char *str;
unsigned len;
public:
String();
String(const char* s);
String(const String& s);
String(unsigned size, char = ' ');
String(unsigned size);
~String();
// другие функции-элементы
3. Верно или нет? Следующий оператор, который создает объект s класса String, объявленного ранее, является правильным:
s = String("Hello Borland C++");
4. Если в программе OPERATOR.CPP вы следующим образом измените объявления объектов, будет ли программа компилироваться без ошибок?
String s1 = String("Kevin");
String s2 = String(" Нау");
String s3 = s1;