
- •6. Использование указателя this. Встраиваемые (inline-) функции. Статические члены класса.
- •8. Перегрузка функций (методов класса). Почему следует использовать перегрузку. Перегрузка функций. Перегрузка конструкторов.
- •10.Перегрузка операций (операторов). Понятие перегрузки операторов. Синтаксис перегрузки операции. Перегрузка бинарных операторов.
- •11. Перегрузка операций (операторов). Перегрузка операторов отношения и логических операторов. Перегрузка оператора присваивания. Перегрузка унарных операторов.
- •12. Перегрузка операций (операторов). Перегрузка операторов инкремента и декремента. Перегрузка оператора индексирования. Перегрузка оператора вызова функции.
- •13.Перегрузка операций (операторов). Перегрузка операторов доступа к членам класса. Перегрузка операторов new и delete. Функции преобразования типа.
- •14. Наследование. Производные классы. Синтаксис производного класса. Простое наследование. Множественное наследование. Виртуальные базовые классы. Создание производных классов.
- •15. Полиморфизм и виртуальные функции. Раннее и позднее связывание. Динамический полиморфизм. Виртуальные функции. Виртуальные и невиртуальные функции.
- •16. Полиморфизм и виртуальные функции. Применение динамического полиморфизма. Виртуальные деструкторы. Абстрактные классы и чисто виртуальные функции.
- •Void *memset(void *dest, int cchar, size_t count);
- •25. Стандартный класс string. Конструкторы строк. Изменение величины строки и ее емкости. Присваивание, добавление и обмен строк. Доступ к символам строки.
- •26. Стандартный класс string. Копирование строк и подстроки. Сравнение строк. Операции поиска.
- •27. Стандартный класс string. Вставка символов в строку. Замена и удаление символов из строки. Операции ввода-вывода строк.
- •Int main ()
- •28. Шаблоны. Шаблоны функций. Перегрузка шаблонов функций. Специализация шаблонов функций. Шаблоны функций сортировки.
- •29. Шаблоны классов. Конкретизация шаблона класса. Специализация шаблонов классов. Статические члены шаблонного класса.
- •30.Ключевое слово typename. Недостатки шаблонов.
- •Символьные функции (ctype.H)
- •Проверка, является ли символ цифрой, буквой или символом ascii
- •Проверка на управляющий символ, разделительный символ (пробел, табуляция, перевод строки) и знак препинания
- •Преобразования в код ascii, к верхнему и нижнему регистрам
- •41. Строковые функции (string.H). Работа с функциями манипуляции памятью. Нахождение символа в строке. Сравнение символов в строках. Заполнение буфера при помощи memset().
- •Работа с функциями манипуляции памятью
- •Нахождение символа в строке
- •Сравнение символов в строках
- •Заполнение буфера при помощи memset()
- •Сравнение содержимого двух строк
- •Приведение символов к верхнему регистру
- •43. Математические функции (math.H). Построение таблицы значений тригонометрических функций.
- •Построение таблицы значений тригонометрических функций
- •Структуры для представления даты/времени и параметры функций
- •Работа с функциями localtime() и asctlme()
- •Работа с функциями gmtime() и asctime()
- •Работа с функцией ctime()
- •45. Общие принципы и средства программирования для Windows. Язык Windows. Краткий обзор среды Windows. Преимущества использования Windows.
- •46. Общие принципы и средства программирования для Windows. Графический интерфейс пользователя. Многозадачная среда. Преимущества ввода посредством очереди.
- •48. Программирование для Windows: принципы и понятия. Окно Windows. Элементы интерфейса Windows.
- •49. Программирование для Windows: принципы и понятия. Рамка окна. Заголовок окна. Кнопка оконного меню. Оконное меню. Кнопка свертывания окна. Кнопка развертывания окна.
- •50.Программирование для Windows: принципы и понятия. Вертикальная полоса прокрутки. Горизонтальная полоса прокрутки. Панель меню. Рабочая область окна.
- •52. Программирование для Windows: принципы и понятия. Окна сообщений Windows. Окна диалога Windows. Шрифты Windows. Растровые изображения Windows. Перья Windows. Кисти Windows.
- •61.Новое поколение Windows. Передача информации с помощью сообщений. Независимость от драйверов аппаратуры. Plug-and-play. Библиотеки динамической компоновки. 16 бит против 32 бит.
- •62. Новое поколение Windows. Различные аппаратные платформы. Различные программные платформы. Многопроцессорные системы. Гибкость.
- •63.Новое поколение Windows. Распределенные вычисления. Сертифицированная правительством система обеспечения безопасности. Открытая архитектура систем Windows. Сбои системы. Виртуальная память.
- •64.Требования к программному и аппаратному обеспечению Windows приложений. Требования к программному обеспечению. Требования к аппаратуре.
- •65. Понятия и терминология Windows. Окно Windows. Визуальные компоненты интерфейса. Рамка. Заголовок окна. Кнопка управления или кнопка завершения.
- •66. Понятия и терминология Windows. Системное меню. Кнопка минимизации. Кнопка максимизации. Кнопка завершения.
- •67. Понятия и терминология Windows. Вертикальная полоса прокрутки. Горизонтальная полоса прокрутки. Полоса меню. Клиентская область.
- •68. Классы окон. Объектно-ориентированное программирование. Пиктограммы. Курсоры. Текстовые курсоры. Окна сообщений.
- •71. Ресурсы Windows. Функции Windows. Windows.H и связанные файлы заголовков. Нотация и правила подготовки программ Windows.
- •73. Доступ к оболочке Windows. Система координат. Основные режимы отображения. Координаты устройства.
- •77. Виртуальные клавиши. Системные таймеры. Срабатывание таймера. Эффективное использование механизма таймеров.
- •78. Память. Распределение памяти с помощью операционной системы. Уменьшение количества объектов. Уменьшение размера объекта. Использование перемещаемых объектов.
- •79. Простое приложение Windows. Оболочка для всех приложений. Эффективное использование описателей. Компоненты приложения Windows. Функция WinMain(). Регистрация класса окна.
- •80. Простое приложение Windows. Style. LpfnWndProc. CbClsExtra. CbWndExtra. Hinstance. HIсоn. HCursor. HbrBackground. IpszMenuName. IpszClassName.
- •81. Простое приложение Windows. Создание окна. Отображение и перерисовка окна. Цикл обработки сообщений. Функция GetMessage(). Функция TranslateMessage(). Функция DispatchMessage().
- •82. Простое приложение Windows. Функция окна. Сообщение wm_paint. Сообщение wm_destroy. Функция DefWindowProc(). Написание файла определения модуля.
- •83. Простое приложение и шаблон. Рисование эллипса. Рисование сегмента. Рисование сектора. Рисование прямоугольника.
- •84. Шаблоны приложения. Использование шаблона для создания программы, изображающей синусоиду. Файлы заголовков Windows. Файлы ресурсов. Создание программы для вывода круговых диаграмм.
- •85. Управление окном Windows. Понимание полос прокрутки. Терминология полос прокрутки. Константы полос прокрутки. Диапазон полосы прокрутки. Положение полосы прокрутки. Типы полос прокрутки.
- •96 Работа с ресурсами шрифта. Терминология шрифтов Windows. Константы шрифта. Структура textmetric. Структура logfonta. Ячейка символа шрифта.
- •97 Основные характеристики шрифта. Ширина шрифта. Автоматические кернинг и установка межстрочного интервала. Множества символов oem и ansi.
- •98 Основные характеристики шрифта. Логические и физические шрифты. Векторные, растровые шрифты и шрифты TrueType. Схема отображения шрифтов.
- •99 Выбор семейств шрифтов. Стандартные шрифты. Принтерные шрифты.
- •100 Приложения, управляющие шрифтами. Функция CreateFont(). Функция CreateFontlndirect().
- •102. Средства и методы gdi. Перья. Кисти. Изменение цветов фона. Изменение цветов текста.
- •104 Работа с битовыми образами. Функции BitBlt() и PlgBlt(). Загрузка и вывод на экран битовых образов. Обработка битовых образов при помощи функции Windows nt MaskBlt().
- •105. Вращение графических образов. Вращение прямоугольника.
- •108. Разработка приложений Win32. Важные изменения для переносимости программ в Windows 95 или Windows nt. Типы и структуры данных для Win32. Описатели в Win32.
- •Важные изменения для переносимости программ в Windows 95 или Windows nt.
- •Описатели в Win32.
- •109 Разработка приложений Win32. Менеджер палитр. Использование логической палитры.
- •110 Разработка приложений Win32. Шаблон приложения win32swp. Особенности поддержки Win32 в win32swp.C. Функция WinMain(). Регистрация класса окна. Создание окна.
- •111. Разработка приложений Win32. Отображение и перерисовка окна. Цикл обработки
- •112 Разработка приложений Win32. Функция окна. Обработка сообщений wm_paint. Обработка сообщения wm_destroy. Функция DefWIndowProc().
- •113 Подключение ресурсов. Приложение Win32 win32bar. Круговая диаграмма. Приложение pie.Cpp.
- •116. Библиотека Microsoft Foundation Classes. Необходимость библиотеки mfc. Принципы построения библиотеки mfc. Основные возможности библиотеки mfc.
- •117. Библиотека Microsoft Foundation Classes. Все начинается с cObject. Важнейшие классы библиотеки. Создание приложения mfc Windows. Выбор количества окон, которые будут поддерживаться приложением.
- •118. Библиотека Microsoft Foundation Classes. Базы данных. Поддержка составных документов. Внешний вид приложения и другие опции. Другие опции.
- •119. Библиотека Microsoft Foundation Classes. Имена файлов и классов. Создание приложения. Поработайте самостоятельно.
- •120. Упрощенное приложение. Вывод окна в приложении 23simple.Cpp. Использование afxwin.H. Создание класса, производного от cWinApp. CFrameWnd.
- •121. Упрощенное приложение. Реализация метода Inltlnstance(). Конструктор. Запуск 23simple.Cpp. Упрощение структуры облегчает сопровождение.
- •124. Диалоговые окна и элементы управления. Формирование ресурсов диалогового окна. Задание идентификаторов диалогового окна и элементов управления. Создание диалогового окна Sample Dialog.
- •128. Линейчатая диаграмма с использованием меню и окон диалога.
- •Заголовочный файл 24bar.H.
- •Заголовочный файл ресурсов 24barr.H, файл описания ресурсов 24bar.Rc и файл описания окна диалога 24bar.Dlg.
- •Исходный текст программы 24bar.Cpp.
- •Особенности Microsoft Foundation Classes, относящиеся к Windows 95 и nt.
- •Изучаем win32mfctmp.Cpp.
- •130. Научная графика с использованием ресурсов: меню, окна диалога и мультимедийного звука. Заголовочный файл win32mfcfour.H. Заголовочный файл ресурсов
1. Введение в объектно-ориентированное программирование. Традиционное программирование. Объектно-ориентированное программирование. С++ и объектно-ориентированное программирование. Терминология объектно-ориентированного программирования.
Традиционное структурное программирование.
Процедурно-ориентированная программа на С или С++ структурируется так, что обычно имеется главная функция и, возможно, несколько других функций (подпрограмм), вызывающихся из главной. Главная функция, как правило, небольшая, и основная работа ложится на остальные процедуры программы. Программа начинается с первого оператора главной функции и заканчивается последней командой этой же функции.
При таком подходе код и данные разделены. Процедуры определяют, что происходит с данными, но никогда не бывает наоборот. При объектно-ориентированном программировании это положение меняется. Процедурный подход имеет несколько недостатков, главный из которых — сложность сопровождения программы. Для того чтобы добавить или удалить программный код, зачастую для включения новых процедур приходится перерабатывать всю программу.Поэтому необходим более пригодный способ сопровождения программ.
Объектно-ориентированное программирование.
Одна из идей ООП — программа состоит из набора объектов, зачастую связанных друг с другом. В С++ объекты создаются при помощи нового типа данных class. Класс состоит из набора переменных (данных) и операций (методов или функций-членов класса), работающих с этими переменными. Манипулировать полученными классами можно посредством сообщений.
В ООП объекты содержат не только данные-члены класса, но и методы (функции-члены класса) для работы с данными. Объекты состоят из данных и методов, работающих с ними.
Преимущества ООП. Первое касается сопровождения программы. Программы легче читать и понимать, ООП дает возможность управлять сложностью программы, при этом программист видит только необходимые детали. Второе преимущество относится к модифицируемости программы (добавление или удаление функциональных возможностей). Третье преимущество заключается в том, что объекты можно использовать многократно.
С++ и объектно-ориентированное программирование.
Концепции ООП не признают языковых границ. К примеру, одним из первых языков, позволяющих использовать объекты, был Мicrosoft Quick Раsса1. Тип С++ clаss, построенный на основе типа С struct, дает этому языку возможность создания объектов. Кроме этого, в С++ имеются несколько дополнительных возможностей ООП, упрощающих использование объектов, но не включенных в другие языки. Достоинствами С++ являются сильная типизация, возможность перегрузки операций и меньшая нагрузка на препроцессор.
Терминология объектно-ориентированного программирования.
ООП — это метод программирования, позволяющий рассматривать концептуальную модель как набор объектов. Основой для объекта часто являются структуры данных; поэтому в С или С++ тип struct может образовывать элементарный объект. Как уже упоминалось, манипулировать с объектами можно при помощи сообщений, которые напоминает вызовы функций в процедурно-ориентированной программе. Когда объект получает некоторое сообщение, на него реагируют методы, содержащиеся в этом объекте. Методы аналогичны функциям в процедурно-ориентированном программировании; однако, они являются частью объекта.
2. Введение в объектно-ориентированное программирование. Абстракция данных. Инкапсуляция (encapsulation). Иерархия классов. Наследование (inheritance). Полиморфизм (polymorphism). Виртуальные функции (virtual functions).
Инкапсуляция (encapsulation).
Инкапсуляция — это способ объединения данных объекта и функций-членов (методов) в единую структуру. В классах С++ для управления функциональными элементами объекта используются дескрипторы private, public и/или ргоtected. Как правило, в ООП раздел public используется для интерфейса (методов), позволяющего использовать этот класс в приложении. Если данные или методы находятся в разделе public, то они доступны извне класса. Раздел класса private ограничивает доступность данных или методов — они изолированы внутри класса. Раздел ргоtected (защищенный) содержит данные или методы, принадлежащие данному классу и любым производным подклассам.
Иерархия классов.
На практике классы С++ служат эталоном или образцом для создания объектов. Объекты, образованные на основе описания класса, называются экземплярами (instance) класса. Можно построить иерархию классов, состоящую из базового класса-родителя (parent) и нескольких классов-потомков (child) — в С++ для этого служат производные (derived) классы. Родительские классы представляют общие задачи, а производные классы-потомки реализуют более конкретные требования.
Наследование (inheritance).
В ООП наследованием называется способность класса наследовать свойства других классов различных объектных классов. Родительский класс служит для производного класса образцом, который можно изменять различными способами. Если объект наследует атрибуты от одного родителя, то имеет место простое наследование; если наследуются атрибуты от нескольких родителей, то такой процесс называется множественным наследованием. Концепция наследования имеет большое значение, поскольку позволяет повторно использовать описание класса без изменений в основном коде. Наследование стимулирует многократное использование кода, так как производные классы могут расширять возможности родительских классов.
Полиморфизм (polymorphism).
С иерархией классов связана другая важнейшая концепция ООП, смысл которой в следующем: одни и те же сообщения можно посылать объектам родительского класса и объектам всех производных подклассов; формально это качество называется полиморфизмом,
Полиморфизм позволяет каждому объекту подкласса реагировать некоторым образом на формат сообщения согласно его описанию. Родительский класс содержит основную информацию, общую для всех производных классов, а производные классы хранят дополнительные сведения, касающиеся особенностей конкретного рода занятий. Благодаря полиморфизму, каждому классу можно посылать одно и то же сообщение для ввода данных. Все классы: родительский и производные — соответствующим образом реагируют на это сообщение. Полиморфизм стимулирует расширение существующего кода.
Виртуальные функции (virtual functions).
В С++ эта возможность является результатом позднего связывания; при этом адреса определяются динамически при выполнении программы, а не статически, во время компиляции — как в обычных транслируемых языках. Статический (фиксированный) процесс часто называют ранним связыванием. Имена функций при этом заменяются адресами памяти. Позднее связывание осуществляется при помощи виртуальных функций, которые определяются в родительском классе, в то время как последующие производные классы перегружают их, переопределяя реализацию конкретной функции. При использовании виртуальных функций сообщения передаются не непосредственно объекту, а в виде указателя, ссылающегося на объект.
Для адресации виртуальные функции используют таблицу. Эта таблица инициализируется на этапе выполнения при помощи конструктора. Конструктор вызывается всякий раз при создании объекта класса. В данном случае задача конструктора — связать виртуальную функцию с таблицей адресов. При компиляции адрес виртуальной функции не известен; вместо него указывается позиция в таблице адресов, которая будет содержать адрес функции.
3. Первый взгляд на классы С++. Структура как простейший класс. Синтаксис и правила для классов С++. Простой класс С++.
Первый взгляд на классы С++.
Тип С++ clаss является расширением типа С struct.
Структура как простейший класс.
Во многом структура в С++ напоминает простейший вид класса. Для ее определения используется ключевое слово struct.
#include <iostream>
using namespace std;
struct math_operations
{
double data_value;
void set_value(double ang) {data_value=ang;};};
Первое, на что следует обратить внимание, это то, что внутри структуры содержатся описания данных и функций-членов. Редко встречаются функции-члены, описанные в структуре. Такие функции могут работать только с данными, содержащимися в этой структуре (или классе).
Класс может иметь данные-члены и функции-члены. По умолчанию при объявлении С++ struct данные и функции-члены имеют тип public (раздел public содержит данные и функции, которые доступны извне структуры).
Для доступа к функциям-членам структуры обычно используется операция "точка" (.). Структуре или классу можно назначить переменные-указатели — тогда используется операция "стрелка" (->).
Синтаксис и правила для классов С++.
Описание класса С++ начинается с ключевого слова class. Затем сразу же следует имя класса (теговый тип).
class тип {
тип переменная1
тип переменная2
public:
функция-член1
функция-член2
} имя, связанное с типом класса;
Переменные-члены следуют непосредственно за объявлением класса. По умолчанию это — частные (private) для класса переменные и доступ к ним возможен только посредством функций-членов, которые находятся дальше.
Функции-члены обычно следуют за объявлением public. Благодаря этому, к ним можно обращаться из внешних для класса процедур. Все функции-члены класса имеют доступ к любым разделам этого класса: public, private и protected.
Простой класс С++.
По умолчанию элементы класса С++ имеют локальную видимость. Это означает, что переменные-члены доступны только функциям-членам этого класса. Если функции-члены должны иметь видимость за пределами класса, то это нужно указать явно.
Любой элемент класса — как частный, так и общий — имеет доступ ко всем остальным элементам класса.
Функции-члены класса обычно описываются в программе непосредственно после объявления класса и перед функцией main(). Функции, не относящиеся к классам, по-прежнему описываются после функции main() и имеют прототипы обычного вида.
4. Классы С++. Дополнительные особенности классов. Простой класс. Вложенные классы. Вложенные структуры внутри класса. Альтернативный вариант вложенных описаний.
Тип C++ class обладает достоинствами структур и возможностью ограниченного доступа к определенным данным при помощи функций, также являющихся членами класса. Расширенные возможности классов включают в себя возможность инициализировать и защищать жизненно важные функции и данные.
Концепция классов C++ позволяет сделать шаг к абстрактным типам данных. Класс реализует тип данных-членов и увязывает с данными функциями-членами; с их помощью стало возможным использование концепции хранения структурированных данных вместе с функциями, которые оперируют с переменными-членами .
Описание класса начинается с ключевого слова class, за которым следует имя класса (тег). Обычно функции-члены объявляются как public. Объявление private делает переменные-члены видимыми только для функций-членов данного класса. Часто это явление называется сокрытием данных (data hiding). Объявление public обеспечивает доступность функций-членов за пределами класса:
class car {
int mileage;
int tire_pressure;
float speed;
public:
int maintenace(int) ;
int wear_record(int);
int air_resistance(float);
} mycar;
При использовании вложенных классов нужно следить за тем, чтобы получившееся объявление не было бы слишком сложным.
#include <iostream>
#include <string.h>
using namespace std;
class employee
{
struct emp_name
{
char firstname[20];
char middlename[20];
char lastname[20];
} name;
struct emp_hours
{
double hours;
double base_sal;
double overtime_sal;
} hours;
public:
void emp_input(void);
void emp_output(void);
};Видимость вложенных классов такая же, какой бы она была, если бы эти классы были описаны за пределами класса employee.
Возможно использование следующего синтаксиса для вложенных описаний:
class cars {
int mileage;
public:
void trip(int t);
int speed(float s) ;
};
class contents {
int count;
public:
cars mileage;
void rating(void);
}
Здесь класс cars является вложенным внутри класса contents. Вложенные классы — будь они внутри или снаружи описания — имеют одинаковую область видимости.
5. Конструкторы и деструкторы. Список инициализации элементов. Конструкторы по умолчанию и конструкторы копирования. Создание простых конструкторов и деструкторов. Использование конструкторов для инициализации переменных-членов класса. Использование конструкторов и деструкторов для выделения и освобождения свободной памяти.
Конструктор — это метод класса. Конструкторы используются для инициализации переменных класса или для выделения памяти. Они всегда имеют такое же имя, как и класс, в котором они определены. Конструкторы располагают дополнительными возможностями: они могут иметь аргументы и их можно перегружать. Конструктор выполняется автоматически при создании объекта типа class. Объекты свободной памяти — это такие объекты, которые генерирует операция new, они служат для выделения памяти создаваемым объектам. Если конструкторы не определены явно, то они генерируются компилятором Microsoft Visual C/C++.
Деструктор — это метод класса, использующийся обычно для освобождения памяти, выделенной из пула свободной памяти. Деструктор — также как и конструктор — имеет такое же имя, как и класс, в котором он описан; ему предшествует символ "тильда" (~). Деструкторы являются дополнениями конструкторов. Деструктор вызывается автоматически при использовании операции delete по отношению к указателю класса или в случае, когда программа выходит из области действия объекта класса. Деструкторы, в отличие от конструкторов, не могут иметь параметров и их нельзя перегружать. Они также создаются компилятором Microsoft Visual C/C++, если не определены явно.
#include <iostream>
using namespace std;
class coins
{
int number;
public:
coins() {cout << "Begin Conversion!\n";}
~coins() {cout << "\nFinished Conversion!\n";}
void get_cents(int);
int quarter_conversion(void);
};
Когда методы класса включены в функции, такое описание называется явным. Методы можно определять обычным образом (то есть после определения класса и перед функцией main
Другое практическое назначение конструкторов — инициализация локальных переменных класса
class coins {
int number;
public:
coins() {number=431;} // конструктор
~ coins () (cout « "\nFinished Conversion! ";} // деструктор
int quarter_conversion (void);
int dime_conversion (int);
int nickel_conversion (int);
};
Возможно, в первую очередь конструкторы необходимы при использовании свободной памяти. В примере конструктор выделяет память для указателя string1 при помощи операции new. Также используется деструктор, который возвращает системе выделенную память при уничтожении объекта. Это выполняется посредством операции delete.
class string_operation
{
char *string1;
int string_len;
public:
string_operation(char *) {string1=new char[string_len];}
~ string_operation() {delete string1;}
void input_data(char *);
void output_data(char *);
};
Память, выделяемую указателю string1 при помощи операции new, можно освободить только посредством последующего вызова операции delete. Поэтому память для указателей обычно выделяют конструкторы, а освобождают — деструкторы. Это гарантирует, что если переменная, связанная с классом, выходит из области действия, то занимаемая память возвращается системе. Эти операции обеспечивают динамическое распределение памяти и наиболее удобны в программах, работающих со связанными списками. Память, занимаемая такими типами данных как int и float, автоматически возвращается системе.
6. Использование указателя this. Встраиваемые (inline-) функции. Статические члены класса.
Ключевое слово this применяется для обозначения рекурсивного указателя, который неявно объявляется в C++, например:
class_name *this; //class_name — это тип класса
Указатель this указывает на объект, метод которого вызывается. Приведем пример, используемый в описании класса:
class class_nаmе {
char chr;
public:
void begin_conv(char k) {chr=k;}
char conv_chr(void) {return (this -> chr);}
};
в данном случае указатель this нужен для доступа к локальной переменой члену класса chr. Имеются и другие варианты применения указателя this. Его можно использовать для осуществления связи в двойном связанном списке или при написании конструкторов и деструкторов, управляющих распределением памяти. Посмотрите на следующий пример:
class class_name{
int x,y,z;
char chr;
public:
class_name(size) {this=new(size);}
~class_name(void) {delete(this);}
};
Встраиваемые (inline-) функции
Размещая функции внутри класса, вы тем самым объявляете их встроенными {inline). Если вы создаете встроенные функции класса этим способом, C++ дублирует функцию для каждого создаваемого объекта этого класса, помещая встроенный код при каждой ссылке на метод (функцию) класса. Преимущество такого встроенного кода состоит в увеличении производительности. Недостатком является очень быстрое увеличение объема самого определения класса. Кроме того, включение кода функции в определение класса может существенно запугать класс, делая его элементы трудными для восприятия.
Для улучшения читаемости определений ваших классов вы можете вынести функции из определения класса, как вы обычно и делаете, и разместить ключевое слово inline перед определением функции. Например, следующее определение заставляет компилятор использовать встроенные операторы для функции show_employee:
inline void employee::show_employee(void)
{
cout << "Имя: " << name << endl;
cout << "Должность: " << position << endl;
cout << "Оклад: $" << salary << endl;
}
Статические члены класса
Данное - член класса можно объявить со служебным словом static. Память под такие данные резервируется при запуске программы, .т.е. еще до того, как программист явно создаст первый объект данного абстрактного типа. При этом все объекты, сколько бы их ни было, используют эту заранее созданную одну - единственную копию своего статического члена. Статический член класса должен быть инициализирован после определения класса и до первого описания объекта этого класса с помощью так называемого полного или квалифицированного имени статического члена, которое имеет вид имя_класса::имя_статического_члена.
Если статический член имеет доступ public, то его также можно использовать в программе с помощью квалифицированного имени, как и обычным образом, с помощью уточненного имени.
Следующий пример показывает простой класс с единственной статической переменной:
class StaticDemo
{
static int x = 0;
StaticDemo()
{
x++ ;
}
}
7. Константные объекты и константные функции-члены класса. Ключевое СЛОВО mutable. Использование указателей на функции-члены класса. Массивы объектов класса. Дружественные функции и друзья класса. Использование дружественных функций для доступа к частным переменным класса.
Константные объекты и константные функции-члены
Если создать представитель класса с модификатором const, то компилятор будет проинформирован, что содержимое объекта не должно изменяться после инициализации. Чтобы предотвратить изменение значений элементов константного объекта, компилятор генерирует сообщение об ошибке, если объект используется с неконстантной функцией-элементом.
Константная функция-элемент, объявляемая с ключевым словом const после списка параметров, должна удовлетворять следующим правилам:
• она не может изменять значение элементов данных класса;
• не может вызывать неконстантные функции-элементы класса;
• может вызываться как для константных, так и неконстантных объектов класса.
Для того чтобы сделать функцию константной, необходимо указать ключевое слово const после прототипа функции, но до начала тела функции. Если объявление и определение функции разделены, то модификатор const необходимо указать дважды – как при объявлении, так и при ее определении. Те методы, которые только лишь считывают данные из поля класса, имеет смысл делать константными, поскольку у них нет необходимости изменять значения полей объектов класса.
Пример исп-ния константной функции-члена:
class X
{ private:
int n;
public:
int f() const;}; int X::f() const { return n++; }
Обычно константные объекты создают для того, чтобы получить гарантии того, что данные объекта невозможно будет изменить. Однако иногда случаются ситуации, когда вы хотите создать объект-константу, имеющий определенное поле, которое нужно будет изменять, несмотря на то, что сам объект является константой. Для этих целей необходимо соответствующее поле объявить со спецификатором mutable. Например, объявив в предыдущем примере поля iX, iY следующим образом:
mutable int iX, iY;
Указатели на функции-члены
В программах на С++, большинство функций являются членами. Это означает, что они являются частью класса. И использовать обычный указатель на функцию в этом случае нельзя. Вместо этого нужно использовать указатель на функцию-член. Указатель на функцию-член класса SomeClass объявляется следующим образом:
float (SomeClass::*my_memfunc_ptr)(int, char*)
// Для константных функций-членов используется объявление
float (SomeClass::*my_const_memfunc_ptr)(int, char*) const;
Указатели на функции члены имеют основное ограничение, состоящее в том, что они могут указывать на функции только того класса, где объявлены. Можно приводить один тип указателя на функцию к другому типу. Не разрешается приводить указатель на функцию к указателю на void.
Массивы объектов класса
Чтобы можно было описать массив объектов класса с конструктором, этот класс должен иметь стандартный конструктор, т.е. конструктор, вызываемый без параметров. Например, в соответствии с определением
table tbl[10];
будет создан массив из 10 таблиц, каждая из которых инициализируется вызовом table::table(15), поскольку вызов table::table() будет происходить с фактическим параметром 15.
Важной особенностью классов является их возможность изолировать (скрывать) данные. Для устранения этой возможности существуют такие функции, которые называются "друзьями" (friend) класса или "дружественными". Дружественные функции позволяют использовать частную информацию класса, не являясь членами этого класса. Эти функции, не описываемые в самом классе, могут работать с теми же ресурсами класса, к которым обращаются функции-члены. Достоинство дружественных функций в том, что они — внешние по отношению к описанию класса
Пример: class time_class
{ long secs;
friend char *present_time(time_class); //дружественная функция
public:
time_class(char *);
};
time_class::time_class(char *tm){….}
char *present_time(time_class); //protatipe
int main (){…}
char *present_time(time_class tz){…}