
- •220300 - Системы автоматизированного проектирования
- •Тема 2. Технологии программирования
- •Тема 2. Технология разработки крупных приложений
- •Структуры
- •Структуры и функции
- •Массивы структур
- •Поиск в массиве структур
- •Вложенность структур
- •Рекурсия
- •Алгоритм быстрой сортировки
- •Массивы структур и бинарные файлы
- •Динамические структуры данных
- •Линейные списки
- •Очереди
- •Контрольная работа
- •Объектно-ориентированное программирование. Классы
- •Конструкторы
- •Перегруженные конструкторы
- •Определение методов класса вне класса
- •Объекты, возвращаемые функцией (методом)
- •Структуры и классы
- •Классы и память
- •Статические данные класса
- •Константные методы
- •Деструкторы
- •Массивы и классы
- •Массивы объектов
- •Строки Строковый тип или стандартный класс string
- •Тип строк AnsiString
- •Перегрузка операций
- •Перегрузка арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операции приведения типа
- •Преобразования объектов в основные типы и наоборот
- •Преобразование объектов классов в объекты других классов
- •Наследование
- •Конструкторы производного класса
- •Перегрузка функций
- •Иерархия классов
- •Общее и частное наследование. Комбинации доступа
- •Множественное наследование
- •Включение. Классы в классах
- •Виртуальные и дружественные функции
- •Абстрактные классы и чистые виртуальные функции
- •Виртуальные деструкторы
- •Виртуальные базовые классы или устранение неоднозначности при множественном наследовании
- •Дружественные функции
- •Дружественные классы
- •Указатель this
- •Многофайловые программы
- •Распознавание нажатых клавиш
Объекты, возвращаемые функцией (методом)
Рассмотрим пример, демонстрирующий каким образом функция может возвратить объект в вызывающую программу.
class Distance {
___ " ___ (всё тоже самое)
Distance plus(Distance a2);
};
//---------------------------------------------------------------------------
int main() {
Distance d1, d2(11, 6.25), d3;
d1.getdist();
d3=d1.plus(d2);
cout << "\n d1 = "; d1.showdist();
cout << "\n d2 = "; d2.showdist();
cout << "\n d3 = "; d3.showdist();
getch(); return 0;
}
//---------------------------------------------------------------------------
Distance Distance::plus(Distance a2) {
Distance s;
s.inch = inch + a2.inch;
s.feet = 0;
if(s.inch >= 12.0) {
s.inch = s.inch - 12.0;
s.feet++;
}
s.feet += feet + a2.feet;
return s;
}
В отличие от предыдущей программы, в данной программе в качестве аргумента в функцию plus(Distance) передаётся лишь один аргумент: объект d2, который складывается с объектом d1, к которому относится вызываемый метод plus(Distance). Результат сложения возвращается в главную функцию и присваивается объекту d3. Обратите внимание на то, что значение переменной d1 не изменяется, а всего лишь используется методом plus().
Рассмотрим следующий НЕРАБОТАЮЩИЙ пример, демонстрирующий отличие методов класса от функций.
…
Distance summa(Distance a1, Distance a2);
};
//---------------------------------------------------------------------------
int main() {
Distance d1, d2(11, 6.25), d3;
d1.getdist();
d3=summa(d1, d2); // нельзя, т.к. метод не может быть вызван без объекта (метод не понимает для кого он работает)
d3.summa(d1, d2); // для такой записи нужен void –метод, а не Distance
cout << "\n d1 = "; d1.showdist();
cout << "\n d2 = "; d2.showdist();
cout << "\n d3 = "; d3.showdist();
getch(); return 0;
}
//---------------------------------------------------------------------------
Distance Distance:: summa(Distance a1, Distance a2) {
Distance s;
s.inch = a1.inch + a2.inch;
s.feet = 0;
if(s.inch >= 12.0) {
s.inch = s.inch - 12.0;
s.feet++;
}
s.feet += a1.feet + a2.feet;
return s;
}
Структуры и классы
Все примеры, рассмотренные нами до сих пор, подтверждали негласный принцип: структуры предназначены для объединения данных, а классы – для объединения данных и функций. На самом деле разница между структурами и классами заключается лишь в том, что по умолчанию все члены класса являются скрытыми, а все члены структуры – открытыми. Но при изменении структуры, можно добиться её эквивалентности с классом (см. табл.).
-
class F {
private:
int data1;
public:
void func();
};
struct F {
void func();
private:
int data1;
};
Классы и память
В процессе изучения классов и объектов может сформироваться представление об объекте как о копии класса с точки зрения внутренней структуры. На самом деле всё устроено несколько сложнее. Каждый объект имеет собственные независимые поля данных. С другой стороны, все объекты одного класса используют одни и те же методы. Методы класса создаются и помещаются в память компьютера всего один раз – при создании класса. Это вполне оправданно, поскольку нет никакого смысла держать в памяти копии методов для каждого объекта данного класса, так как у всех объектов методы одинаковы. А поскольку наборы значений полей у каждого объекта свои, поля объектов не должны быть общими. Это значит, что при создании объектов каждый из наборов данных занимает определённую совокупность свободных мест в памяти.