
Многочлены: что можно ждать от типа и языка
Поведение типа в значительной степени диктуется тем, как он понимается в сообществе, которое использует его. То, как ведет себя многочлен, определяется установками математического сообщества. Когда мы собираемся написать тип для многочлена, мы ожидаем, что основные математические операции, такие как +, -, * и /, доступны и работают надлежащим образом. Более того, мы ожидаем, что предоставленные операторы присваивания, равенства, инкремента и декремента согласуются с представления ми сообщества C++. Класс обеспечивает открытый интерфейс, который легко использовать, если только он соответствует обоим представлениям. Перегрузку не следует применять в случае, если отсутствует определенное ожидаемое поведение оператора.
Более реалистичный класс для многочлена основан на представлении из раздела 6.9, «Многочлен как связный список», на стр. 174. Он может содержать следующие объявления: |
В файле ро1у2.срр
//Многочлены с перегруженными арифметическими операторами
class polynomial {
public:
polynomial() ;
polynomial(const polynomial& p) ;
polynomial(int size, double coef[], int expon[]);
~polynomial() { release(); }
void print() const;
double operator()(double x) const; //вычисляет Р(х) polynomial& operator=(const polynomial& a);
friend polynomial& operator+(const polynomial& a,
const polynomial& b) ;
friend polynomial& operator- (const polynomial& a,
const polynomial& b);
friend polynomial& operator*(const polynomia& a,
const polynomial& b);
friend polynomial& operator/(const polynomial& a,
const polynomial& b);
friend polynomial& operator-(const polynomial& a);
friend polynomial& operator+=(const polynomial& a,
const polynomial& b);
friend bool operator= =(const polynomial& a,
const polynomial& b) ;
friend bool operator!=(const polynomial& a,
const polynomial& b) ;
private:
term* h;
int degree;
void prepend(term* t);
void add_term(term*& a, term*& b);
void release();
void rest_of(term* rest);
void reverse() ;
};
Мы полагаем, что все математические операции будут работать и сохранятся все основные отношения между операторами C++. Было бы нехорошо, если бы при перегрузке operator= (), operator+ () и operator+= () выражение а = а + b не давало бы тот же результат, что и а += b.
Вот код для перегрузки operator= ():
polynomial& polynomial::operator=(const polynomial& a)
{
if (h != a.h) { //избегаем случая а = а
release (); //сборка мусора от старых значений polynomial* temp = new polynomial(a);
h = temp -> h;
degree = temp -> degree;
}
return *this;
}
Реализация прочих операторов оставлена для упражнений (см. упражнение 22, на стр.226).