Программирование >>  Расширенная версия языка c++ 

1 ... 48 49 50 [ 51 ] 52 53 54 ... 227


Глава 5 грузка функций 1S9

Из этого примера должно быть ясно, что невозможно передать по умолчанию значение а и при этом задать Ь.

Когда вы создаете функцию, имеющую один или более передаваемых по умолчанию аргументов, эти аргументы должны задаваться только один раз: либо в прототипе функции, либо в ее определении, если определение предшествует первому использованию функции. Аргументы по умолчанию нельзя задавать одновременно в определении и в прототипе функции. Это правило остается в силе, даже если вы просто дублируете одни и те же аргументы по умолчанию.

Как вероятно, догадываетесь, все параметры, задаваемые по умолчанию, должны указываться правее параметров, передаваемых обычным путем. Больше того, после того как вы начали определять параметры по умолчанию, параметры, которые по умолчанию не передаются, уже определять нельзя.

Еще несколько слов об аргументах по умолчанию: они должны быть константами или глобальными переменными. Они не могут быть локальными переменными или другими параметрами.

Примеры

1. Программа для иллюстрации вышеописанной функции:

Первый простой пример аргументов по умолчанию Sinclude <iostieam>

using namespace std;

void f(int a = 0, int b = 0)

{

cout << a: a << , b: b;

cout << \n;

{ . .

f 0 ;

f (10);

tao. 99);

return 0;

Как и следовало ожидать, на экран выводится следующее: а: О; О

а: 10, Ь: О - - у

а: 10, Ь: 99



160 Самоучитель С++

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

большое изменение функции f() приведет к ошибке при компиляции программы:

void f(int a = 0, in b) Неправильно! Параметр b тоже должен

задаваться по умолчанию

cout а: а , Ь: Ь;

cout \п ; -т--

I . , .

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

/* Расчет площади прямоугольника с использованием перегрузки функций */

#include <iostream> .= . f,

using name space std;

Возвращает площади тороннегс прямоугольника double rect area (double length, double width)

{ . . . -

return length * width;

I -

Возвращает площадь квадрата

double rectarea (double length)

return length * length;

int mainO

cout прямоугольника 10 x равна:

cou readO.O, 5.8) \n;

cou;< площадь квадрата 10 x 10 равна : ; cout rect area(10.0) \n;

return 0;

В ЭТОЙ программе функция rect area() перегружается двумя способами. В первом - функции передаются оба размера фигуры. Эта версия используется для прямоугольника. Однако в случае квадрата необходимо задавать только один поэтому вызывается вторая версия функции



int mainO

cout площадь прямоугольника 10 x 5.8 равна: ; t>iJ

cout rect areadO.O, 5.8) \n;

cou площадь квадрата 10 x 10 равна: ; , . cout rect area(10.0) \n;

.. - 4-

return D;

Теперь параметру width по умолчанию присваивается нуль. Такое значение выбрано потому, что не бывает прямоугольника с нулевой стороной. (Фактически, прямоугольник с нулевой стороной - это линия.) Таким образом, когда в встречается такое, переданное по умолчанию значение, для ширины прямоугольника автоматически используется параметр

length.

Как показано в этом аргументы по умолчанию часто обеспечивают

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

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

♦include <iostream>

using namespace std;

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

как флаг для функции rect area(). Когда функция встретит это значение, она

дважды использует параметр length. Пример такого подхода:

/* Расчет площади прямоугольника с передачей аргументов по умолчанию */

linclude <iostrearo>

using namespace std;

Возвращает площадь прямоугольника

double а (doubl-i length, double width = 0)

if(Iwidth) width = length; return length * width,-



1 ... 48 49 50 [ 51 ] 52 53 54 ... 227

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