    29: 
    30:	// Ввод цены и ставки налога вещественными значениями двойной точности 
    31:	// Замечание: изменяет значение paid и rate 
    32:	void GetData(double &paid, double &rate) 
    33:	{ 
    34:	paid = GetDouble("Price paid?"); 
    35:	rate = GetDouble("Tax rate (ex: .06)?"); 
    36:	} 
    37: 
    38:	// Вычисляет цену и налог по сумме и ставке 
    39:	// Замечание: изменяет значение list и tax                             
    40:	void Calculate(const double paid, const double rate, 
    41:	double &list, double &tax) 
    42:	{ 
    43:	list = paid / (1 + rate); 
    44:	tax = paid - list; 
    45:	}

    В программе определены три функции. Первая функция запрашивает и 
возвращает вещественное значение двойной точности — обычное описание функции, 
возвращающей некоторое значение: 

    double GetDouble(const char *prompt); 

    Вторая функция демонстрирует использование ссылочных параметров для 
возврата двух или более значений. Заметьте, что обоим параметрам функции 
предшествует символ &, означающий, что эти параметры передаются по ссылке 
(т.е. в GetData передаются их адреса вместо значений): 

    void GetData (double &paid, double &rate); 

    Рассмотрим тело функции GetData. В нем дважды вызывается GetDouble с 
аргументом-строкой, которая должна отображаться, и полученные значения 
присваиваются ссылочным параметрам paid и rate: 

    paid - GetDouble("Price paid?"); 
    rate = GetDouble("Tax rate (ex: .06)?"); 

    Поскольку paid и rate — ссылки, значения присваиваются объектам, 
переданным функции GetDouble(). Например, в функции main() следующий оператор 
вводит значения в две переменные, также названные paid и rate: 

    GetData(paid, rate); 


    ЗАМЕЧАНИЕ 

    Некоторые критикуют передачу параметров функций gj ссылке, верно замечая, 
что такие вызовы выглядят обманчиво, поскольку аргументы в них передаются по 
ссылке неявно. Ключ к решению этой проблемы и эффективному использованию 
ссылочных параметров — хорошее документироваяие программ. Обязательно должен 
присутствовать комментарий, в котором указывается, что вызов GetData изменяет 
значения paid и rate 

    Третья, и последняя, функция в примере вычисляет цену и налог к уплате, 
основываясь на действительной цене и ставке налога. Первых два параметра, paid 
и rate, — входные параметры функции. Поскольку функция не изменяет их, они 
объявлены константами, и передаются только их значения (точнее, копии их 
значений). Вторых два параметра, list и tax, — это выходные значения функции. 
Эти значения изменяются функцией и, следовательно, передаются по ссылке: 

    void Calculate(const double paid, const double rate, double &list,  double &tax) 

    Функция Calculate присваивает новые значения list и tax в следующих операторах: 

    list = paid / (1 + rate);	
    tax = paid - list;                     

    Поскольку параметры — ссылки, в действительности используются переменные, 
переданные функции Calculate(). Операция присваивания происходит по ссылке, 
вследствие чего изменяются действительные переменные, когда в функции main 
происходит следующий вызов: 

    Calculate(paid, rate, list, tax); 

    Аргументы, передающиеся по значению, невозможно отличить от аргументов, 
передающихся по ссылке. Хорошее документирование функции Calculate уменьшит 
опасность подобных ошибок. 
    Ссылки и указатели в качестве параметров тесно связаны. В самом деле, 
ссылки могут интерпретироваться компилятором C++ как указатели. Для того чтобы 
вникнуть в суть этой идеи, рассмотрим следующую небольшую функцию: 

    void f(int *ip) 
    *ip = 1234; 


    300     Часть III. Программирование на ANSI C++ 
