Программирование >>  Дополнительные возможности наследования 

1 ... 73 74 75 [ 76 ] 77 78 79 ... 265


Итак, искомые значения (квадрат и куб заданного числа) возвращаются в вызывающую функцию не путем использования механизма возврата значений, а за счет изменения значений переменных, указатели которых переданы в функцию.

В строках 36 и 37 посредством указателей переменным в функции main() присваиваются возвращаемые значения. В строке 38 переменной Value присваивается значение возврата, означающее успешное завершение работы функции. В строке 40 это значение Value возвращается вызывающей функции.

Эту программу можно слегка усовершенствовать, дополнив ее следующим объявлением:

enum ERROR VALUE { SUCCESS, FAILURE} ;

Затем вместо возврата значений О или 1 эта профамма сможет возвращать SUCCESS или FAILURE.

Возвращение значений с помощью ссылок

Несмотря на то что листинг 9.8 прекрасно работает, его можно упростить как для чтения, так и в эксплуатации, если вместо указателей использовать ссылки. В листинге 9.9 показана та же самая программа, но вместо указателей в качестве параметров функции в ней используются ссылки, а также добавлено упомянутое выше перечисление ERROR.

Листинг а.а. Возвращение значений с номощьи ссыдак

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

Листинг 9,9,

Возвращение нескольких значений из функции с помощью ссылок

Sinclude <iostream,h>

typedef unsigned short USHORT; enum ERR CODE { SUCCESS, ERROR } ;

ERR CODE Factor(USHORT, USHORT&, USHORT&);

int main() {

USHORT number, squared, cubed; ERRCODE result:

cout Enter a number (0 - 20): ; cin >> number:

result = Factor(number, squared, cubed);

if (result == SUCCESS) {

cout number: number \ n ; cout square: squared \ n cout cubed: cubed \ n



27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

else

cout Error encountered!!\ n ; return 0; }

ERR C0DE Factor(USH0RT n. USHORT &rSquared, USHORT &rCubed) {

if (n > 20)

return ERROR; simple error code

else {

rSquared = n.n; rCubed = n.n*n; return SUCCESS;

Enter a number (0 - 20): 3 number: 3 square: 9 cubed: 27

Листинг 9.9 идентичен листингу 9.8 с двумя исключениями. Перечисление ERR C0DE делает сообщение об ошибке более явным (см. строки 36 и 41), как, впрочем, и его обработку (строка 22).

Однако более существенные изменения коснулись функции FactorO. Теперь эта функция объявляется для принятия не указателей, а ссылок на переменные squared и cubed, что делает манипуляции над этими параметрами гораздо проще и легче для понимания.

Передача ссылок на переменные как средство повышения зффектовности

При каждой передаче объекта в функцию как значения создается копия этого объекта. При каждом возврате объекта из функции создается еще одна копия.

На занятии 5 вы узнали о том, что эти обьекты копируются в стек и на этот процесс расходуется время и память. Для таких маленьких объектов, как базовые целочисленные значения, цена этих расходов незначительна.

Однако для больших объектов, создаваемых пользователем, расходы ресурсов существенно возрастают. Размер такого объекта в стеке представляет собой сумму всех его переменных-членов. Причем каждая переменная-член может быть, в свою очередь, подобным объектом, поэтому передача такой массивной структуры путем копирования в стек может оказаться весьма дорогим удовольствием как по времени, так и по занимаемой памяти.

Кроме того, существуют и другие расходы. При создании временных копий объектов классов для этих целей компилятор вызывает специальный конструктор-копировщик. На следующем занятии вы узнаете, как работают конструкторы-копировщики и



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

При разрущении временного объекта, которое происходит при возврате из функции, вызывается деструктор объекта. Если объект возвращается функцией как значение, копия этого объекта должна быть сначала создана, а затем разрущена.

При работе с большими объектами эти вызовы конструктора и деструктора могут оказать слишком ощутимое влияние на скорость работы профаммы и использование памяти компьютера. Для иллюстрации этой идеи в листинге 9.10 создается пользовательский объект SimpleCat. Реальный объект имел бы размеры побольше и обошелся бы дороже, но и этого примера вполне достаточно, чтобы показать, насколько часто вызываются конструктор-копировщик и деструктор.

Итак, в листинге 9.10 создается объект SimpleCat, после чего вызываются две функции. Первая функция принимает объект Cat как значение, а затем возвращает его как значение. Вторая же функция принимает указатель на объект, а не сам объект, и возвращает указатель на объект.

Листинг 9.10. Оередача оОъектов как ссыдок с помощь дкозатедеО

Листинг 9.10,

Передача указателей на объекты

flinclude <iostream,h>

class SimpleCat {

public:

10 11 12 13 14 !5

16- cout << Simple Cat Constructor...\n ;

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

SimpleCat (); конструктор

SimpleCat(SimpleCat&); консгруктор-комировщик SimpleCatO; деструктор

SimpleCat::SimpleCat()

SimpleCat::SimpleCat(SimpleCat&) {

cout << Simple Cat Copy Constructor...\ n ;

SimpleCat:: SimpleCat() {

cout Simple Cat Destructor...\ n ;

SimpleCat FunctionOne (SimpleCat ttieCat); SimpleCat* FunctionTwo (SimpleCat ttieCat);

int mamO



1 ... 73 74 75 [ 76 ] 77 78 79 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика