Точно так же можно присвоить начальное значение указателю в функции f 2(), например:
void f2(TMoney *t = new TMoney) { t->DisplayMoney(): }
Или
void f2(TMoney *t = new TMoney(300)) { t->DisplayMoney(); }
И в этом случае вызывается конструктор инициализации. Надо только учесть, что в этой функции при таком объявлении может произойти утечка памяти, если вызвать функцию без параметра: параметр-указатель передается по значению, и в функции создается внутренняя локальная копия указателя. При завершении функции локальная копия указателя просто уничтожается и возникает потерянная ссылка.
Естественно, для присвоения начального значения можно вызвать и функцию, возвращающую значение типа TMoney. Интересно, что язык С++ позволяет вызывать определяемую функцию для присвоения значения собственному параметру. Немного изменим функцию f 1 () — пусть она возвращает значение типа TMoney:
TMoney fl(TMoney t)
{ cout << "fl=M; t.DisplayMoneyO ; t = t.AddMoney(1); return t:
}
Тогда мы можем проделать фокус, который иллюстрирует листинг 2.5.
Листинг 2.5. Присвоение начального значения параметру той же функцией TMoney fl(TMoney t);
TMoney fl(TMoney t = f1(100)) // вызов определяемой функции { cout << Hfl="; t.DisplayMoneyO; t = t.AddMoney(1.0); return t:
}
Посмотрите внимательно на этот пример: для присвоения начального параметра в заголовке f 1() используется функция fl()! И это не является рекурсивным вызовом. Прототип функции писать обязательно: если его не будет, при трансляции возникают ошибки http://www.sanatera.ru/uslugi/biorezonansnaya-diagnostika.html.
Проверка:
fК) .DisplayMoneyO ; cout << endl: // - 1 f1(200).DisplayMoneyO; cout << endl: // - 2 Эта проверка показывает, что функция работает совершенно правильно. На экран выводится http://www.sanatera.ru/uslugi/biorezonansnaya-diagnostika.html:
fl=100.00 // вызов в прототипе
f1=101.00 // вызов в - 1 - без параметра
102.00 // вывод результата вызова
f1=200.00 // вызов в - 2 - с явным параметром
201.00 // вывод результата вызова
В [10] можно найти несколько примеров на эту тему для разных видов параметров.
Выражение f 1() .DisplayMoneyO является совершенно правильным, ведь функция f 1 () возвращает объект типа TMoney. Поэтому в данном случае, как обычно, создается временный анонимный объект, для которого и вызывается метод вывода на экран DisplayMoneyO http://www.sanatera.ru/uslugi/konsultaciya-vracha/konsultacija-nevrologa.html. |