
- •220300 - Системы автоматизированного проектирования
- •Тема 2. Технологии программирования
- •Тема 2. Технология разработки крупных приложений
- •Структуры
- •Структуры и функции
- •Массивы структур
- •Поиск в массиве структур
- •Вложенность структур
- •Рекурсия
- •Алгоритм быстрой сортировки
- •Массивы структур и бинарные файлы
- •Динамические структуры данных
- •Линейные списки
- •Очереди
- •Контрольная работа
- •Объектно-ориентированное программирование. Классы
- •Конструкторы
- •Перегруженные конструкторы
- •Определение методов класса вне класса
- •Объекты, возвращаемые функцией (методом)
- •Структуры и классы
- •Классы и память
- •Статические данные класса
- •Константные методы
- •Деструкторы
- •Массивы и классы
- •Массивы объектов
- •Строки Строковый тип или стандартный класс string
- •Тип строк AnsiString
- •Перегрузка операций
- •Перегрузка арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операции приведения типа
- •Преобразования объектов в основные типы и наоборот
- •Преобразование объектов классов в объекты других классов
- •Наследование
- •Конструкторы производного класса
- •Перегрузка функций
- •Иерархия классов
- •Общее и частное наследование. Комбинации доступа
- •Множественное наследование
- •Включение. Классы в классах
- •Виртуальные и дружественные функции
- •Абстрактные классы и чистые виртуальные функции
- •Виртуальные деструкторы
- •Виртуальные базовые классы или устранение неоднозначности при множественном наследовании
- •Дружественные функции
- •Дружественные классы
- •Указатель this
- •Многофайловые программы
- •Распознавание нажатых клавиш
Конструкторы
Как правило, удобнее инициализировать поля объекта автоматически в момент его создания, а не явно вызывать в программе соответствующий метод. Такой способ инициализации реализуется с помощью особого метода класса, называемого конструктором. Конструктор – это метод класса, предназначенный для инициализации объекта и выполняющийся автоматически в момент создания объекта. У конструкторов есть несколько особенностей. Во-первых, имя конструктора в точности совпадает с именем класса, что позволяет компилятору отличить конструктор от других методов класса. Во-вторых, у конструкторов не существует возвращаемого значения (даже типа void). Это объясняется тем, что конструктор автоматически вызывается системой, и, следовательно, не существует вызывающей программы или функции, которой конструктор мог бы возвратить значение.
Приведём пример, в котором вместо метода setdata() используется два конструктора (без аргументов и с аргументами).
class Tovar {
private:
enum { N = 30 }; // static const int N = 30;
char name[N];
int number;
float cena;
public:
Tovar() {
//name[0]='\0'; или strcpy(name,"\0"); number = 0; cena=0.;
cout << "\n Konstruktor 1" << endl;
}
Tovar(char* tname, int tnum, float tcen) {
strcpy(name, tname);
number = tnum;
cena = tcen;
cout << "\n Konstruktor 2" << endl;
}
void getdata() {
…
}
void showdata() {
…
}
};
int main() {
Tovar t1("Sanki der.", 1100, 231.45), t2;
t2.getdata();
//t2=t1; //такая операция допускается
t1.showdata(); t2.showdata();
getch(); return 0;
}
В данном примере, прослеживается такое явление, как перегрука конструкторов. Перегрузка уже встречалась нам при изучении функций. Компилятор определяет требуемый для запуска конструктор по числу и характеру (типу) аргументов. Для объекта t1 запускается конструктор 2, а для t2 – конструктор 1.
Рассмотрим другой пример, демонстрирующий использование альтернативного синтаксиса конструкторов, определение методов вне класса и использование объектов в качестве аргументов функций. Предположим, необходимо создать инженерный проект с использованием английской системы мер. Было бы удобно представлять длины в виде двух чисел, одно из которых равнялось бы количеству футов, а другое – количеству дюймов.
class Distance {
private:
int feet;
float inch;
public:
Distance(): feet(0), inch(0.0) // конструктор без аргументов
{ }
Distance(int ft, float in): feet(ft), inch(in) // конструктор с двумя аргументами
{ }
void getdist() { // ввод длины пользователем
cout << "\n Vvedite chislo futov: "; cin >> feet;
cout << " Vvedite chislo duymov: "; cin >> inch;
}
void showdist() { // вывод длины на экран
cout << feet << "'-" << inch << "''";
}
void add_dist(Distance a1, Distance a2); // прототип
};
//-----Определение методов класса вне класса (сложение длин)
void Distance::add_dist(Distance a1, Distance a2) {
inch = a1.inch + a2.inch; // Сложение дюймов
feet = 0; // с возможным за¸мом
if(inch >= 12.0) { // Если число дюймов больше 12.0, то
inch = inch - 12.0; // уменьшаем число дюймов на 12.0 и
feet++; // увеличиваем число футов на 1.
}
feet += a1.feet + a2.feet; // Сложение футов
}
//---------------------------------------------------------------------------
int main() {
Distance d1, d2(11, 6.25), d3; // определение и инициализация d2
d1.getdist(); // ввод значений для d1
d3.add_dist(d1, d2); // d3=d1+d2
cout << "\n d1 = "; d1.showdist();
cout << "\n d2 = "; d2.showdist();
cout << "\n d3 = "; d3.showdist();
getch(); return 0;
}
В этом примере приведён альтернативный синтаксис конструкторов, который аналогичен уже рассматривавшемуся ранее и более эффективному:
Distance() {
feet = 0; inch = 0;
}
Distance(int ft, float in) {
feet = ft;
inch = in;
}
Основной блок этой программы начинается с присвоения начальных значений полям объекта d2 класса Distance, после чего производится его сложение с экземпляром d1, инициализируемым пользователем. На экран выводится следующее:
Vvedite chislo futov: 11
Vvedite chislo duymov: 6.25
d1 = 11'-6.25"
d2 = 11'-6.25"
d3 = 23'-0.5"