Объект является экземпляром типа данных и как таковой может передаваться в качестве параметра функции или возвращаться как значение функции. Подобно другим типам С++, объектный параметр может передаваться по значению или по ссылке. Положения этого раздела иллюстрируются примерами из класса Temperature.
Объект как возвращаемое значение
Любой тип класса может быть возвращаемым типом функции. Например, функция SetDailyTemp принимает в качестве параметра массив чисел, представляющий показания температуры, извлекает максимальное и минимальное показания из списка и возвращает объект Temperature с этими крайними значениями.
Temperature SetDailyTemp(float reading[], int n)
{
//создание t с 1-ми значениями high и low
Temperature t(reading[0], reading[0]);
//обновление high или low, если необходимо
for (int i=1; i<n; i++)
t.UpdateTemp(reading[i]);
//возвращение t с крайними температурами этого дня
return t;
}
Массив reading содержит шесть температурных значений. Для определения высокой и низкой температур вызовите SetDailyTemp и присвойте результат объекту today. Чтобы вывести эти температуры на экран, используются методы GetHighTemp и GetLowTemp.
float reading[6]={40,90,80,60,20,50};
Temperature today=SetDailyTemp(reading,6);
cout << "Сегодняшние высокая и низкая температуры такие"
<< today.GetHighTemp() << "и"
<< today.GetLowTemp() << endl;
Объект как параметр функции
Объекты могут передаваться как параметры функции по значению или по ссылке. Следующие примеры иллюстрируют соответствующий синтаксис.
Функция TemperatureRange использует вызов по значению (call by value) параметра Т типа Temperature и возвращает разницу между самой высокой и самой низкой температурами. При выполнении этой функции вызывающий элемент копирует объект типа Temperature (фактический параметр) в Т.
float TemperatureRange(Temperature T)
{
return T.GetHighTemp()-Т.GetLowTemp();
}
Функция Celsius использует вызов по ссылке (call by reference) параметра Т типа Temperature, который, как первоначально подразумевалось, содержит значения по Фаренгейту. Функция создает объект типа Temperature, чьи самое высокое и самое низкое показания преобразуются в значения по Цельсию, и присваивает его объекту Т.
void Celsius(Temperature& T)
{
float hi, low;
//с = 5/9*(f-32)
hi = float(5)/9*(T.GetHighTemp() -32);
low = float(5)/9*(T.GetLowTemp() -32);
T = Temperature(hi, low);
}
Пример: объект Water содержит точку кипения (212° по Фаренгейту) и точку замерзания (32° по Фаренгейту) воды в качестве самого высокого и самого низкого температурных значений. Результат использования функции TemperatureRange показывает, что 180° - это диапазон для воды по шкале Фаренгейта. С помощью функции Celsius преобразуем эти температуры в значения по Цельсию и вызовем TemperatureRange, чтобы показать, что 100° - это соответствующий диапазон по шкале Цельсия,
Temperature Water(212, 32);// кипение при 212F,замерзание
// при 32F
cout <<"Температурный диапазон воды по шкале Фаренгейта"
<< TemperatureRange(Water) << endl;
Celsius(Water); //преобразование температуры по Фаренгейту
//в температуру по Цельсию
cout <<"Температурный диапазон воды по шкале Цельсия"
<< TemperatureRange(Water) << endl;
Массивы объектов
Тип элемента массива может включать не только встроенные типы данных, такие как int или char, но также определяемые пользователем типы класса. Результирующий массив объектов может использоваться для создания списков, таблиц и так далее. Однако, использование объектных массивов требует осторожности. Объявление массива вызывает конструктор для каждого объекта в списке. Сравните простое объявление одного объекта Rectangle и массива из 100 объектов Rectangle. В каждом объявлении конструктор вызывается для создания объекта, который задает длину и ширину. В случае массива конструктор вызывается для каждого из 100 объектов.
Rectangle pool(150,100);//создание бассейна 150х100
Rectangle room[100]; //конструктор вызывается для
//комната[0].. [99]
Объявление объекта pool передает начальные значения конструктору. Объекты room фактически имеют начальные значения, поскольку конструктор Rectangle присваивает нулевые значения по умолчанию длине и ширине объекта:
Rectangle(float 1=0, float w=0); //параметры по умолчанию
После объявления массива длина и ширина каждого объекта room[i] имеют нулевые значения:
cout << room[25].GetLengh() //выход 0;
cout << room[25].GetWidth() //выход 0;
room[25].PutLengh(10)//установка длины комнаты[25] на 10
room[25].PutWidth(5)//установка ширины комнаты[25] на 5
Объявление массива объектов Rectangle поднимает важную проблему, касающуюся массивов и классов. Если конструктор класса Rectangle не имеет параметров по умолчанию, объявление массива room вызовет ошибку, потому что каждый массив будет требовать параметры. Объявлению потребуется список инициализаторов массива, который управляет каждым элементом в массиве. Например, для объявления массива room из 100 элементов и установки параметров длины и ширины на 0 потребуется список инициализаторов 100 объектов Rectangle. В действительности это не практикуется.
Rectangle room[100] = {Rectangle (0, 0),,.., Rectangle(0, 0)};
Для объявления массива объектов мы предоставляем конструктору значения по умолчанию или просто создаем конструктор без параметров.
Конструктор умолчания
Конструктор умолчания (default costructor) — это конструктор, не требующий никаких параметров. Это бывает, когда конструктор не имеет параметров или когда каждый параметр имеет значение по умолчанию. В этой главе класс Rectangle содержит конструктор умолчания, тогда как класс Temperature требует параметров при объявлении объекта.
Класс Rectangle
КОНСТРУКТОР
Rectangle (float l=0, float w=0);
Конструктор содержит параметры l и w со значением по умолчанию 0. При создании массива Rectangle значения по умолчанию присваиваются каждому объекту.
Rectangle R[25];//каждый элемент имеет значение Rectangle(0,0)
Класс Temperature
КОНСТРУКТОР
Temperature(float h, float l);
Класс Temperature не содержит конструктор по умолчанию. Вместо этого, объекту должно быть дано начальное значение для высокой и низкой температуры. Объявление объектов today и week является недействительным!
Temperature today; //недействительно: отсутствуют параметры
Temperature week[7]; //Temperature не имеет конструктора по умолчанию