- •Создание простой программы
- •Компиляция вашей программы
- •Создание второй программы
- •Изучение синтаксических ошибок
- •Что вам необходимо знать
- •Взгляд на операторы программы
- •Представление об операторе #include
- •Что такое void main(void)
- •Использование void
- •If errorlevel 0 if not errorlevel 1 goto successful if errorlevel 1 if not errorlevel 2 goto no_file if errorlevel 2 if not errorlevel 3 goto no_paper rem Далее идут другие команды
- •Представление о группирующих операторах { }
- •Использование cout для отображения вывода на экран
- •Что вы должны знать
- •Урок з. Вывод сообщений на экран
- •Использование cout для вывода чисел
- •Вывод нескольких значений одновременно
- •Использование специальных символов вывода
- •Другие специальные символы
- •Вывод восьмеричных и шестнадцатеричных значений
- •Вывод на стандартное устройство ошибок
- •Управление шириной вывода
- •Что вам необходимо знать
- •Урок 4. Программы хранят информацию в переменных
- •Объявление переменных в программах
- •Смысловые имена переменных
- •Слова, которые нельзя использовать для имен переменных
- •Присваивание значения переменной
- •Присваивание значения при объявлении
- •Использование значения переменной
- •Превышение диапазона значений переменной
- •Представление о точности
- •Использование комментариев для улучшения чтения ваших программ
- •Что вам необходимо знать
- •Урок 5. Выполнение простых операций
- •Основные математические операции
- •Увеличение значения переменной на 1
- •Представление о префиксной (до) и постфиксной (после) операциях увеличения
- •Старшинство операций
- •Следите за ошибками переполнения при арифметических операциях
- •Что вам необходимо знать
- •Урок 6. Чтение ввода с клавиатуры
- •Первое знакомство с cin
- •Следите за ошибками переполнения
- •Следите за ошибками несовпадения типов
- •Чтение символьных данных
- •Чтение слов с клавиатуры
- •Что вам необходимо знать
- •Урок 7. Программа принимает решение
- •Сравнение двух значений
- •Знакомство с оператором if
- •Представление о простых и составных операторах
- •Оператор else
- •Применение составных операторов для else
- •If (условие_истинно) оператор; else оператор;
- •If (условие_истинно)
- •Использование отступов для улучшения удобочитаемости вашей программы
- •Проверка двух или более условий
- •Обработка нескольких условий
- •Использование оператора switch
- •Что вам необходимо знать
- •Урок 8. Повторение одного или нескольких операторов
- •Повторение операторов указанное число раз
- •Изменение и увеличение цикла for
- •Взгляд на цикл while
- •Выполнение операторов по крайней мере один раз
- •Что вам необходимо знать
- •Создание и использование ваших первых функций
- •Программа может передавать информацию в функции
- •Функции могут возвращать результат вызвавшей функции
- •Функции, которые не возвращают значение
- •Использование возвращаемого функцией значения
- •Представление о прототипах функций
- •Что вам необходимо знать
- •Урок 10 изменение значений параметров
- •Почему функции обычно не могут изменить значения параметров
- •Изменение значения параметра
- •Второй пример
- •Что вам необходимо знать
- •Использование функций библиотеки этапа выполнения
- •Изучение функций библиотеки этапа выполнения
- •Что вам необходимо знать
- •Урок 12. Локальные переменные и область видимости
- •Объявление локальных переменных
- •О конфликте имен
- •Глобальные переменные
- •Если имена глобальных и локальных переменных конфликтуют
- •Представление об области видимости переменных
- •Что вам необходимо знать
- •Первое знакомство с перегрузкой функций
- •Когда необходима перегрузка
- •Что вам необходимо знать
- •Ссылка является псевдонимом
- •Использование ссылок в качестве параметров
- •Рассмотрим второй пример
- •Правила работы со ссылками
- •Чт0 вам необходимо знать
- •Урок 15. Значения параметров по умолчанию
- •Определение значений по умолчанию
- •Правила для пропуска значений параметров
- •Что вам необходимо знать
- •Урок 16. Хранение значений в массивах
- •Объявление переменной массива
- •Обращение к элементам массива
- •Использование индексной переменной
- •Инициализация массива при объявлении
- •Передача массивов в функции
- •Что вам необходимо знать
- •Урок 17. Символьные строки
- •Объявление символьных строк в программах
- •Как 'а' отличается от "а"
- •Инициализация символьной строки
- •Передача строк в функции
- •Преимущества того, что null представляет собой ascii 0
- •Использование строковых функций библиотеки этапа выполнения
- •Что вам необходимо знать
- •Урок 18. Хранение связанной информации в структурах
- •Объявление структуры
- •Использование элементов структуры
- •Структуры и функции
- •Функции, изменяющие элементы структуры
- •Что вам необходимо знать
- •Что вам необходимо знать
- •Урок 20. Указатели
- •Использование указателя на символьную строку
- •Второй пример
- •Уменьшение количества операторов
- •Использование указателей с другими типами массивов
- •О математике указателя
- •Что вам необходимо знать
- •Представление об объектах и объектно-ориентированном программировании
- •Определение методов класса вне класса
- •Второй пример
- •Что вам необходимо знать
- •Сокрытие информации
- •Использование общих и частных элементов класса
- •Использование оператора глобального разрешения для элементов класса
- •Частные элементы класса не всегда являются данными
- •Что вам необходимо знать
- •Урок 23. Конструктор и деструктор
- •Создание простого конструктора
- •Конструкторы и параметры по умолчанию
- •Перегрузка конструкторов
- •Представление о деструкторе
- •Что вам необходимо знать
- •Урок 24. Перегрузка операторов
- •Перегрузка операторов плюс и минус
- •Второй пример
- •Операторы, которые Вbl he можете перегрузить
- •Что вам необходимо знать
- •Урок 25. Статические функции и элементы данных
- •Совместное использование элемента данных
- •Использование элементов с атрибутами public static, еслиобъекты не существуют
- •Использование статических функций-элементов
- •Что вам необходимо знать
- •Урок 26. Наследование
- •Простое наследование
- •Второй пример
- •Что такое защищенные элементы
- •Разрешение конфликта имен
- •Что вам необходимо знать
- •Простой пример
- •Построение иерархии классов
- •Что вам необходимо знать
- •Определение друзей класса
- •Ограничение количества друзей
- •Что вам необходимо знать
- •Создание простого шаблона функции
- •Шаблоны, которые используют несколько типов
- •Что вам необходимо знать
- •Создание шаблона класса
- •Что вам необходимо знать
- •Использование оператора new
- •Освобождение памяти, если она больше не нужна
- •Второй пример
- •Что вам необходимо знать
- •Создание обработчика для операций со свободной памятью
- •Создание собственных операторов new Иdelete
- •Что вам необходимо знать
- •Урок 33. Дополнительные возможности cin и cout
- •Что внутри iostream.H
- •Использование cout
- •Использование символа-заполнителя
- •Управление цифрами значений с плавающей точкой
- •Вывод и ввод одного символа за один раз
- •Чтение ввода с клавиатуры по одному символу за раз
- •Чтение с клавиатуры целой строки
- •Что вам необходимо знать
- •Вывод в файловый поток
- •Чтение из входного файлового потока
- •Чтение целой строки файлового ввода
- •Определение конца файла
- •Проверка ошибок при выполнении файловых операций
- •Закрытие файла, если он больше не нужен
- •Управление открытием файла
- •Выполнение операций чтения и записи
- •Что вам необходимо знать
- •Урок 35 встроенные функции и ассемблерные коды
- •Встроенные функции
- •Использование ключевого слова inline
- •Встроенные функции и классы
- •Использование операторов языка ассемблера
- •Что вам необходимо знать
- •Доступ к argv и argc
- •Выполнение цикла, пока argv не содержит null
- •Трактовка argv как указателя
- •Использование аргументов командной строки
- •Доступ к переменным среды операционной системы
- •Что вам необходимо знать
- •Использование именованных констант
- •Использование именованных констант для упрощения изменения кода
- •Замена выражений макрокомандами
- •Чем макрокоманды отличаются от функций
- •Использование макрокоманд предоставляет большую гибкость
- •Что вам необходимо знать
- •Что такое полиморфизм
- •Создание полиморфного объекта-телефона
- •Что такое чисто виртуальные функции
- •Что вам необходимо знать
- •Использование оператора throw для генерации исключительной ситуации
- •Определение обработчика исключительной ситуации
- •Использование элементов данных исключительной ситуации
- •Обработка неожиданных исключительных ситуаций
- •Объявление генерируемых функцией исключительных ситуаций
- •Исключительные ситуации и классы
- •Что вам необходимо знать
Ограничение количества друзей
Как вы только что узнали, если вы объявляете один класс другом другого класса, вы обеспечиваете классу-другу доступ к частным элементам данных этого другого класса. Вы также знаете и то, что чем больше доступа к частным данным класса, тем больше шансов на внесение ошибок в программу. Следовательно, если доступ к частным данным другого класса необходим только нескольким функциям класса, C++ позволяет указать, что только определенные функции дружественного класса будут иметь доступ к частным элементам. Предположим, например, что класс librarian, представленный в предыдущей программе, содержит много разных функций. Однако предположим, что только функциям change_catalog и get_catalog необходим доступ к частным элементам класса book. Внутри определения класса book мы можем ограничить доступ к частным элементам только этими двумя функциями, как показано ниже:
class book
{ public: book(char *, char *, char *); void show_book(void); friend char *librarian::get_catalog(book); friend void librarian: :change_catalog( book *, char *); private: char title[64]; char author[ 64 ]; char catalog[64]; };
Как видите, операторы friend содержат полные прототипы всех дружественных функций, которые могут напрямую обращаться к частным элементам.
О функциях-друзьях
Если ваша программа использует друзей для доступа к частным данным класса, вы можете ограничить количество функций-элементов класса-друга, который может обращаться к частным данным, используя дружественные функции. Для объявления функции-друга укажите ключевое слово friend, за которым следует полный прототип, как показано ниже:
public: friend class_name::function_name(parameter types);
Только функции-элементы, указанные как друзья, могут напрямую обращаться к частным элементам класса, используя оператор точку.
Если ваша программа начинает ссылаться на один класс из другого, вы можете получить синтаксические ошибки, если порядок определения классов неверен. В данном случае определение класса book использует прототипы функций, определенные в классе librarian. Следовательно, определение класса librarian должно предшествовать определению класса book. Однако если вы проанализируете класс librarian, то обнаружите, что он ссылается на класс book:
class librarian
{ public: void change_catalog(book *, char *); char *get_catalog(book); };
Поскольку вы не можете поставить определение класса book перед определением класса librarian, C++ позволяет вам объявить класс book, тем самым сообщая компилятору, что такой класс есть, а позже определить его. Ниже показано, как это сделать:
class book; // объявление класса
Следующая программа LIMITFRI.CPP использует дружественные функции для ограничения доступа класса librarian к частным данным класса book. Обратите внимание на порядок определения классов:
#include <iostream.h>
#include <string.h>
class book;
class librarian
{ public: void change_catalog(book *, char *); char *get_catalog(book); };
class book
{ public: book(char *, char *, char *) ; void show_book (void); friend char *librarian::get_catalog(book); friend void librarian::change_catalog( book *, char *); private: char title[64]; char author[64]; char catalog[64]; };
book::book(char *title, char *author, char *catalog)
{ strcpy(book::title, title); strcpy(book::author, author); strcpy(book::catalog, catalog); }
void book::show_book(void)
{ cout << "Название: " << title << endl; cout << "Автор: " << author << endl; cout << "Каталог: " << catalog << endl; }
void librarian::change_catalog(book *this_book, char *new_catalog)
{ strcpy(this_book->catalog, new_catalog) ; }
char *librarian::get_catalog(book this_book)
{ static char catalog[64]; strcpy(catalog, this_book.catalog); return(catalog) ; }
void main(void)
{ book programming( "Учимся программировать на C++", "Jamsa", "P101"); librarian library; programming.show_book(); library.change_catalog(&programming, "Легкий C++ 101"); programming.show_book(); }
Как видите, программа сначала использует объявление, чтобы сообщить компилятору, что класс book будет определен позже. Поскольку объявление извещает компилятор о классе book, определение класса librarian может ссылаться на класс book, который еще не определен в программе.
Что такое идентификатор класса
Идентификатор представляет собой имя, например имя переменной или класса. Если ваши программы используют дружественные классы, то может случиться, что определение одного класса ссылается на другой класс (его имя или идентификатор), о котором компилятор C++ еще ничего не знает. В таких случаях компилятор C++ будет сообщать о синтаксических ошибках. Чтобы избавиться от ошибок типа "что следует определять сначала", C++ позволяет вам включать в начало исходного текста программы объявление класса, тем самым вводя идентификатор класса:
class class_name;
Эта строка сообщает компилятору, что ваша программа позже определит указанный класс, а пока программе разрешается ссылаться на этот класс.