- •Раздел 4. Разработка по Тема 4.1. Проектирование интерфейса с пользователем
- •4.1.1. Типы пользовательских интерфейсов.
- •4.1.2. Пользовательская и программная модели интерфейса.
- •4.1.3. Разработка диалогов.
- •4.1.4. Основные компоненты графических пользовательских интерфейсов.
- •Тема 4.2. Реализация графических пользовательских интерфейсов.
- •4.2.1. Диалоги, управляемые пользователем.
- •4.2.2. Диалоги, управляемые системой.
- •4.2.3. Использование метафор.
- •4.2.4. Технология Drag and Drop.
- •4.2.5. Интеллектуальные элементы.
- •4.3.1. Базовые типы данных.
- •Константы
- •Область действия имен
- •4.3.2. Указатели и адресная арифметика.
- •4.3.3. Составные типы данных. Структуры
- •Битовые поля
- •Определение типов
- •Перечислимые типы
- •4.3.4. Выражения и операции.
- •4.3.5. Управляющие конструкции. Условные операторы
- •Операторы циклов
- •4.4.1. Статические одномерные массивы.
- •4.4.2. Статические многомерные массивы.
- •4.4.3. Динамические массивы.
- •4.4.4. Массивы указателей.
- •4.5.1. Стеки.
- •4.5.2. Очереди.
- •4.5.3. Списки.
- •4.5.4. Бинарные деревья.
- •4.6.1. Объявление классов и экземпляров классов.
- •4.6.2. Инкапсуляция данных и методов.
- •4.6.3. Конструкторы классов.
- •Конструктор по умолчанию
- •Конструктор копирования
- •4.6.4. Деструкторы классов.
- •4.7.1. Разделы в описании класса.
- •4.7.2. Friend-конструкции.
- •4.7.3. Статические члены классов.
- •4.7.4. Использование описателя const в классах.
- •4.8.1. Вложенность классов.
- •4.8.2. Наследование данных и методов.
- •4.8.3. Типы наследования.
- •4.9.1. Полиморфизм раннего связывания.
- •4.9.2. Полиморфизм позднего связывания и виртуальные функции.
- •4.9.3. Абстрактные методы и классы.
- •4.10.1. Функции консольного ввода-вывода.
- •4.10.2. Функции файлового ввода-вывода.
- •4.10.3. Использование библиотеки классов потокового ввода-вывода.
- •4.11.1. Перегрузка операций.
- •4.11.2. Шаблоны функций.
- •4.11.3. Шаблоны классов.
- •4.11.4. Обработка исключений.
- •Тема 4.12. Com-технология.
- •4.12.1. Основные понятия.
- •4.12.2. Типы интерфейсов.
- •Свойства интерфейсов
- •Типы интерфейсов
- •4.12.3. Типы com-объектов.
- •4.12.4. Фабрика классов.
- •Тема 4.13. Построение com-сервера.
- •4.13.1. Язык idl.
- •Содержимое файла idl
- •4.13.2. Определение пользовательского интерфейса.
- •4.13.3. Реализация пользовательского интерфейса.
- •4.13.4. Создание тестового клиента.
- •Тема 4.14. Обзор платформы ms .Net.
- •4.14.1. Общая идея архитектуры .Net.
- •4.14.2. Достоинства и недостатки .Net.
- •4.14.3. Схема трансляции программ в .Net.
- •4.14.4. Язык msil.
- •4.14.5. Объектно-ориентированная модель .Net.
Конструктор по умолчанию
Конструктор по умолчанию не имеет аргументов и используется при создании неинициализированного объекта:
class MyClass{
public:
MyClass() { }
…..
// Остальные данные и методы
};
Без такого конструктора объекты не могли бы быть определены без задания инициализирующих значений. Если конструктор по умолчанию не объявлен явно, то компилятор автоматически назначает его. Однако, как и все остальное, лучше делать это самому. Он вызывается при таких определениях, как
MyClass clObj;
Как и любая другая функция, конструкторы могут иметь аргументы со значениями, заданными по умолчанию. При этом следует избегать неоднозначностей. Например, в случае определения класса
class MyClass{
public:
MyClass();
MyClass(int nArg = 0);
….
// Остальные данные и методы
};
может возникнуть неопределенность при вызове конструктора
MyClass clObjl (7); // можно — однозначно вызывается MyClass::MyClass(int)
MyClass cl0bj2; // нельзя; неоднозначно задано, какой конструктор
// следует вызывать — MyClass::MyClass(int)
// или MyClass::MyClass(int nArg = 0)
Конструктор копирования
Аргументом конструктора может быть и сам объект класса. Такой конструктор будет иметь следующий прототип:
MyClass::MyClass(MyClass &);
Такие конструкторы запускаются при копировании данных "старого" объекта во вновь создаваемый:
MyClass clObjl(7) ;
MyClass clObjl = cl0bj2;
Если для класса конструктор копирования не определен, то компилятор сделает это сам.
4.6.4. Деструкторы классов.
Еще один метод, называемый деструктором, используется для освобождения памяти, занимаемой членами класса. Особенно важную роль играет деструктор в случае динамического выделения памяти из области heap. Как известно, такую память следует явно освобождать операцией delete. Если тело деструктора создано, то он сделает это автоматически, как только закончит работу функция, в которой определен объект данного класса. Он неявно вызывается в случае выхода программы из области действия объекта. Деструктор носит имя класса, в котором он определен, но перед его именем должен стоять символ ~. Например, описание А::~А(){}; задает деструктор класса А.
В отличие от конструкторов, деструктор класса не имеет аргументов и не может быть перегружен. Деструкторы вызываются строго в обратной последовательности вызова соответствующих конструкторов. Они вызываются автоматически при выходе объекта из блока, в котором были определены. Единственным исключением из этого общего правила является случай, когда объект создается динамически из "кучи", путем вызова оператора new. В этом случае для корректного удаления объекта необходимо явно выполнить оператор delete, который и вызовет необходимый деструктор.
Рассмотрим простой пример, для которого воспользуемся классической функцией main, чтобы избежать дополнительных действий, необходимых для Windows-приложений:
// Простой пример, демонстрирующий
// последовательность вызовов конструкторов и деструкторов
#include <stdio.h>
#include <string.h>
// Объявляем класс
class Sample{
private: // К этим данным доступ возможен только посредством методов
// класса
char *strName;
public: // К этим данным доступ возможен из любого места программы
// Определяем простой конструктор
Sample (char *str) {
strName = new char [strlen (str) + 1] ;
strcpy(strName, str);
printf("Entry in constructor for %s\n", strName);
}
// Определяем деструктор
~Sample(){
printf("Entry in destructor for %s\n", strName);
delete strName;
strName = 0;
}
};
// Определяем первый глобальный объект
Sample globall("global #1");
// "Глупая" функция, иллюстрирующая создание автоматического объекта
void SillyFunc(){
// Определяем объект, локальный для данной функции
Sample fnAuto("automatic function");
printf("Function SillyFunc()\n");
}
int main(int argc, char* argv[])
{
// Определяем первый локальный объект
Sample autol("automatic #1");
printf("Begin main()\n");
SillyFunc();
// Определяем второй локальный объект
Sample auto2("automatic #2");
printf("Continue main()\n");
return 0;
}
// Определяем второй глобальный объект
Sample global2("global #2");
Результаты работы программы:
Entry in constructor for global #1
Entry in constructor for global #2
Entry in constructor for automatic #1
Begin main()
Entry in constructor for automatic function
Function SillyFunc()
Entry in destructor for automatic function
Entry in constructor for automatic #2
Continue main()
Entry in destructor for automatic #2
Entry in destructor for automatic #1
Entry in destructor for global #2
Entry in destructor for global #1
Press any key to continue
Тема 4.7. Скрытие данных в классах Visual C++.