Шрифт:
Function::Function(Fct f,double r1,double r2,Point xy,
int count,double xscale,double yscale)
// строит график функции f(x) для x из диапазона [r1:r2),
// используя count отрезков линий;
// начало координат (0,0) располагается в точке xy
// координаты x масштабируются множителем xscale
// координаты y масштабируются множителем yscale
{
if (r2–r1<=0) error("Неправильный диапазон");
if (count <=0) error("Отрицательное значение count");
double dist = (r2–r1)/count;
double r = r1;
for (int i = 0; i<count; ++i) {
add(Point(xy.x+int(r*xscale),xy.y–int(f(r)*yscale)));
r += dist;
}
}
Параметры
xscale
и yscale
используются для масштабирования координат x и y соответственно. Обычно масштабирование необходимо для того, чтобы правильно расположить рисунок в окне. Обратите внимание на то, что объект класса
Function
не хранит значения, передаваемые его конструктору, поэтому мы не можем впоследствии запросить у функции информацию о том, где находится начало координат, или перерисовать график с другими масштабирующими множителями. Этот объект просто хранит точки (в классе Shape
) и выводит график на экран. Если бы мы хотели повысить гибкость объекта класса Function после его создания, то должны были бы хранить в нем требуемые значения (см. упр. 2). 15.3.1. Аргументы по умолчанию
Обратите внимание на способ инициализации аргументов
xscale
и yscale
конструктора класса Function. Такой способ инициализации называют заданием аргументов по умолчанию (default arguments). Их значения используются тогда, когда при вызове значения аргументов вообще не указываются.
Function s(one,r_min,r_max,orig,n_points,x_scale,y_scale);
Function s2(slope,r_min,r_max,orig,n_points,x_scale); // нет
// yscale
Function s3(square,r_min,r_max,orig,n_points); // нет xscale,
// нет yscale
Function s4(sqrt,r_min,r_max,orig); // нет count, нет xscale,
// нет yscale
Этот фрагмент кода эквивалентен следующему:
Function s(one,r_min,r_max,orig,n_points,x_scale,y_scale);
Function s2(slope,r_min,r_max,orig,n_points,x_scale, 25);
Function s3(square,r_min,r_max,orig,n_points,25,25);
Function s4(sqrt,r_min,r_max,orig,100,25,25);
Аргументы, заданные по умолчанию, являются альтернативой перегруженным функциям. Вместо определения одного конструктора с тремя аргументами, заданными по умолчанию, мы могли бы задать четыре конструктора.
struct Function:Shape { // альтернатива аргументам, заданным
// по умолчанию
Function(Fct f,double r1,double r2,Point orig,
int count, double xscale,double yscale);
// масштаб переменной y по умолчанию:
Function(Fct f,double r1,double r2,Point orig,
int count, double xscale);
// масштаб переменной x и y:
Function(Fct f,double r1,double r2,Point orig,int count);
// значение count по умолчанию и масштаб x и y по умолчанию:
Function(Fct f,double r1,double r2,Point orig);
};