Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Технологии разработки ПО 2005.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
833.54 Кб
Скачать

Объекты, возвращаемые функцией (методом)

Рассмотрим пример, демонстрирующий каким образом функция может возвратить объект в вызывающую программу.

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;

};

Классы и память

В процессе изучения классов и объектов может сформироваться представление об объекте как о копии класса с точки зрения внутренней структуры. На самом деле всё устроено несколько сложнее. Каждый объект имеет собственные независимые поля данных. С другой стороны, все объекты одного класса используют одни и те же методы. Методы класса создаются и помещаются в память компьютера всего один раз – при создании класса. Это вполне оправданно, поскольку нет никакого смысла держать в памяти копии методов для каждого объекта данного класса, так как у всех объектов методы одинаковы. А поскольку наборы значений полей у каждого объекта свои, поля объектов не должны быть общими. Это значит, что при создании объектов каждый из наборов данных занимает определённую совокупность свободных мест в памяти.