Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
43
Добавлен:
16.04.2013
Размер:
64.51 Кб
Скачать

Многочлены: что можно ждать от типа и языка

Поведение типа в значительной степени диктуется тем, как он понимается в сообществе, которое использует его. То, как ведет себя многочлен, определяется установками математического сообщества. Когда мы собираемся написать тип для многочлена, мы ожидаем, что основные математические операции, такие как +, -, * и /, доступны и работают надлежащим образом. Более того, мы ожидаем, что предоставленные операторы присваивания, равенства, инкремента и декремента согласуются с представления ми сообщества 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).

Соседние файлы в папке Тельминов (мб)