- •Предисловие
- •1.1. Общие сведения о программах, лексемах и алфавите языка
- •1.3. Идентификаторы и служебные слова
- •2. Константы: целые, вещественные (с плавающей точкой), перечислимые, символьные (литерные), строковые (строки или литерные строки)
- •3. Операции. Знаки операций. Унарные, бинарные и тернарные операции. Приоритеты операций.
- •3.1 Знаки операций
- •3.2 Унарные операции
- •3.3 Бинарные операции.
- •3.4 Приоритеты операций
- •4. Переменные. Определения и описания. Спецификатор typedef.
- •4.1 Переменные. Определения и описания.
- •4.2 Класс памяти
- •5. Базовые и производные типы данных. Массивы. Указатели, ссылки и адреса. Структуры. Поля битов. Объединения
- •5.1 Массивы
- •5.2 Указатели, ссылки и адреса объектов
- •5.3 Структуры
- •5.3 Поля битов
- •5.4 Объединения
- •6. Операторы
- •6.1 Оператор выражение
- •6.2 Пустой оператор
- •6.3 Составной оператор
- •6.4 Оператор if
- •If (выражение) оператор-1; [else оператор-2;]
- •6.5 Оператор switch
- •6.6 Оператор break
- •6.7 Оператор for
- •6.8 Оператор while
- •6.8 Оператор do while
- •6.9 Оператор continue
- •6.10 Оператор return
- •6.11 Оператор goto
- •7. Функции
- •7.1 Определения, описания и вызовы функций
- •7.2 Начальные (умалчиваемые) значения параметров.
- •7.3 Функции с переменным количеством параметров
- •7.4 Перегрузка функций.
- •7.5 Ссылки и параметры-ссылки.
- •7.6 Шаблоны функций.
- •8. Технологии программирования.
- •8.1 Введение.
- •8.2 Модульное программирование.
- •8.3 Нисходящее программирование.
- •8.4 Структурное программирование.
- •8.5 Понятия объекта, класса объектов.
- •8.6 Основные понятия объектно-ориентированного программирования: инкапсуляция, наследование и полиморфизм.
- •9.1 Тип данных - класс.
- •9.2 Доступность компонентов класса
- •9.3 Конструктор и деструктор
- •9.4 Компоненты-данные и компоненты-функции. Статические и константные компоненты класса
- •10. Указатели на компоненты класса
- •10.1 Указатели на компоненты- данные.
- •10.2 Указатели на компоненты- функции.
- •10.3 Указатель this
- •11. Друзья классов
- •11.1 Дружественная функция
- •11.2 Дружественный класс
- •12. Наследование
- •12.1 Определение производного класса.
- •12.2 Конструкторы и деструкторы производных классов
- •13. Полиморфизм
- •13.1 Виртуальные функции.
- •13.2 Абстрактные классы
- •14. Шаблоны классов
- •15. Перегрузка операций
- •15.1 Общие сведения о перегрузке стандартных операций
- •15.2 Перегрузка унарных операций
- •15.3 Перегрузка бинарных операций
- •15.5 Перегрузка операции вызова функции
- •15.6 Перегрузка операции присваивания
- •15.7 Основные правила перегрузки операций.
- •16. Обработка исключительных ситуаций
- •16.1 Операторы try, throw, catch
- •16.2 Универсальный обработчик исключений
- •17. Структура Windows-приложения
- •17.2 Структура каркасного Windows-приложения
- •17.3 Главная функция WinMain()
- •17.4 Сообщения Windows
- •17.5 Класс окна. Регистрация и его характеристики
- •17.6 Создание и показ окна
- •17.7 Цикл обработки сообщений
- •17.8 Оконная функция
- •17.9 Завершение выполнения приложения
- •18. Препроцессор
- •18.1 Общие пpеобpазования
- •18.2 Директивы Препроцессора
- •18.3 Подключаемые файлы
- •18.4. Директива '#include'.
- •18.5 Однократно подключаемые файлы
- •18.6 Макросы
- •18.7 Стрингификация
- •18.8 Объединение
- •18.9 Удаление макросов
- •18.10 Условия
- •19. Разработка Windows приложений с использованием библиотеки классов mfc (microsoft foundation class library)
- •19.1 Некоторые сведения о программировании Windows-приложений
- •19.2 Преимущества использования mfc
- •19.4 Библиотека mfc
- •20. Простейшие mfc-приложения
- •20.1 Приложение без главного окна
- •20.2 Приложение с главным окном
- •20.3 Обработка окном сообщений
10. Указатели на компоненты класса
10.1 Указатели на компоненты- данные.
Можно определить указатель на компоненты-данные.
тип_данных(имя_класса : :*имя_указателя)
В определении указателя можно включить его инициализатор
&имя_класса : : имя_компонента
Пример.
double(complex ::*pdat) = &complex :: re;
Естественно, что в этом случае данные-члены должны иметь статус открытых(pubic).
После инициализации указателя его можно использовать для доступа к данным объекта.
complex c(10.2,3.6);
c.*pdat=22.2; //изменилось значение поля re объекта c.
Указатель на компонент класса можно использовать в качестве фактического параметра при вызове функции.
Если определены указатели на объект и на компонент, то доступ к компоненту с помощью операции ‘ –>* ’.
указатель_на_объект –>* указатель_на_компонент
Пример
double(complex ::*pdat) = &complex :: re;
complex C(10.2,3.6);
complex *pcom = &C;
pcom –>*pdat = 22.2;
Можно определить тип указателя на компоненты-данные класса:
typedef double(complex::*PDAT);
void f(complex c, PDAT pdat) {c.*pdat=0;}
complex c;
PDAT pdat=&complex::re;
f(c,pdat);
pdat=&complex::im;
f(c,pdat);
10.2 Указатели на компоненты- функции.
Можно определить указатель на компоненты-функции.
тип_возвр_значения(имя_класса::*имя_указателя_на_функцию)(специф_параметров_функции);
Пример
// Определение указателя на функцию-член класса
double(complex ::*ptcom)();
// Настройка указателя
ptcom= &complex::real;
// Теперь для объекта А
complex A(5.2,2.7);
// можно вызвать его функцию
cout<<(A.*ptcom)();
// Если метод real определить типа ссылки
double& real(void){return re;}
// то используя этот метод можно изменить поле re
(A.*ptcom)() = 7.9;
// При этом указатель определяется так
double&(complex: :*ptcom)();
Можно определить также тип указателя на функцию
typedef double&(complex::*PF)();
а затем определить и сам указатель
PF ptcom=&complex::real;
10.3 Указатель this
Когда функция-член класса вызывается для обработки данных конкретного объекта, этой функции автоматически и неявно передается указатель на тот объект, для которого функция вызвана. Этот указатель имеет имя thisи неявно определен в каждой функции класса следующим образом
имя_класса *const this = адрес_объекта
Указатель this является дополнительным скрытым параметром каждой нестатической компонентной функции. При входе в тело принадлежащей классу функции this инициализируется значением адреса того объекта, для которого вызвана функция. В результате этого объект становится доступным внутри этой функции.
В большинстве случаев использование this является неявным. В частности, каждое обращение к нестатической функции-члену класса неявно использует this для доступа к члену соответствующего объекта. Например, функцию add в классе complex можно определить эквивалентным, хотя и более пространным способом:
void complex add(complex ob)
{this->re=this->re+ob.re;
// или *this.re=*this.re+ob.re
this->im=this->im+ob.im;}
Если функция возвращает объект, который ее вызвал, используется указатель this.
Например, пусть функция add возвращает ссылку на объект. Тогда
complex& complex add(complex& ob)
{re=re+ob.re;
im=im+ob.im;
return *this;
}
Примером широко распространенного использования this являются операции со связанными списками.
Пример. Связанный список.
#include<iostream.h>
//Определение класса
class item
{
static item *begin;
item *next;
char symbol;
public:
item (char ch){symbol = ch;} // конструктор
void add(void); // добавить в начало
static void print(void);
};
//Реализация класса
void item :: add(void)
{
this –>next = begin;
begin = this;
}
void item : : print(void)
{
item *p;
p = begin;
while(p != NULL )
{
cout<<p –>symbol<<“ \t ”;
p = p –>next;
}
}
//Создание и просмотр списка
item *item : : begin = NULL; // инициализация статического компонента
void main()
{
item A(‘a’); item B(‘b’); item C(‘c’);
// включение объектов в список
A.add(); B.add(); C.add();
// просмотр списка в обратном порядке
item : : print();
}