Программирование >>  Унарные и бинарные операторы 

1 ... 23 24 25 [ 26 ] 27 28 29 ... 37


Это значит, что, встретив запись а++++, компилятор независи.мо от типа объекта должен выдать сообщение об ошибке-. В реальности так бывает не всегда. 11а1!рнмер, !!ai!! компи-чятор со.эласт программу с такой нпструкцией, по рабо1ает она. копечш , неверно. Никакого у!1елпчсния па две секунды не получается.

ГЛАВА 10 Наследование


myclock а(10.59.29):

cout а++ endl: 10:59:29

cout а endl: 10:59:30

return 0:

Эта програлгма пыводит ка экран сначала (10:59:29), азатем (10:59:30).

Оказывается, операторные функции для всех постфиксных операторов устроены примерно так же, как п для оператора ++ класса myclock (см. листинг 9.14). Па-пример, для целочисленной переменной i, стояще!! справа в равенстве a-i++, компилятор со.зласт временную переменную t, запоминает в ncii значение i, затем увеличивает i па единицу н, наконец, подсовывает t переменной а. Создание BpeMe!inoii переменной в операторной фупкщш для постфнксно1о оператора называется побоч!1ым эффектом и объясняет, почему нельзя записать a++=i. Дело в гом, что вместо а создается временная переменная t, в результате ncixiMCHiiott а нрисвоит1> значение i не удастся. Поэтому в стандарте языка сказано, что пост([)икспый оператор может стоять только справа от знака равенства. По той же причине нельзя записать (а++)++, ведь первый оператор вернет не увеличенное значение а, а временный объект, увеличивать который оператором ++ бессмысленно*.



Составные объекты

в предыдущих главах мы познакомились с двухмерными массивами, описанными классом matrix. Из-за необходимости выделять память во время исполнения программы нам пришлось создавать конструктор, деструктор, конструктор копии и оператор присваивания. Кроме того, у класса matrix появился оператор доступа (). Будет обидно, если вся эта работа пропадет.

Но как применить класс matrix, описывающий двухмерные массивы произвольных размеров, к решению конкретной задачи, скажем, системы из двух уравнений:

Зд: + 5г/ = 21, где

. У =

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

det-a(Ofi) X а(1,1) - а(1,0) X а(0.1),

где a{ij) - элемент матрицы (f - номер строки, j - номер столбца ).

Напомню, что нумерация строк и столбцов начинается с нуля.

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

Так неужели придется создавать новый класс matriх2 2, в котором, кроме уже сделанных конструкторов и операторов, будет еще одна собственная функция, вычисляющая определитель квадратной матрицы 2x2?

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

Чтобы показать, что класс matriх2 2 происходит от класса matrix, используется ключевое слово риЫ ic, предваренное двоеточием:

class matrix2 2 : public matrix { public;

private:

double d; значение определителя }:

Класс matrix2 2 наследует от класса matrix все переменные. То есть в объект класса matrix2 2 перейдут из класса matr l х переменные i nt nrows, i nt ncol s, doubl e *m и еще добавится своя переменная double d. Иными словами, размер объекта matri х2 2, определяемый оператором sizeofO, будет больше, чем у объекта класса matrix, как раз на величину переменной d.



Также не наследуются переопределенный оператор присваииа ния (=) и друзья .

Нужно только понимать, что конструктор базового класса требуется вызывать явно (как .это сделано у пас в листинге 10.1), а деструкторы вызываются автоматически.

В отличие от переменных, конструктор и деструктор не насждуются - прежде всего потому, что довод fa-no редко конструктор базового класса (так мы будем называть класс matrix) подходит классу производному (так мы будем называть класс matri х2 2). Нанример, матрица 2x2 содержит всего четыре элемента, и будег разумно не только выделить для них намять (как это было в классе matrix), но и установить их начальные значения. Поскольку matri х2 2 наследует переменные из matrix, было бы логично вызывать сначала конструктор matrix, а затем конструктор matriх2 2. Для этого в С++ имена конструкторов производного и базового классов разделяются двоеточием:

matrix2 2(): matrix(2.2){

За исключением конструктора и деструктора вес остальные собственные функции бсчзового класса наследуются классом производным. Значит, для вычисления определителя матрицы 2x2 можно использовать уже готовый оператор доступа (), определенн ый в классе matrix. Получившийся класс matriх2 2 показан в листинге 10.1.

Листинг 10.1

Class matrix2 2 : public matrix { public:

matrix2 2 (double aOO. double aOl. double alO. double all) : matrix(2.2)

(*this)(0.0)=aOO: (*th1s)(0.l)=aOl: (*this)(1.0)=alO: (*this)(l.l)=all:

matrix2 2():matrix(2.2){}: double det(){

d = (*this)(0.0)*(*this)(l.l) -

(*this)(0.1)*(*this)(1.0): return d;

private: double d:

В этом классе реализованы два конструктора: первый устанавл нвае г начшьпые значения элементов матрицы, второй же просто выделяет для них память. Собственный деструктор классу matriх2 2 не нужен, потому что намять, выдспенпая конструктором класса matrix, будет освобож/юна его же деструктором. Легко догадаться, что цепочка деструкторов для производного класса вызывается в обратном гюрядке: при создании объекта снач;1ла вызывается конструктор базового класса, затем - производного. При уничтожении объектов сначала запускается деструктор производного класса (в нашем случае - деструктор по умолчанию), а затем - деструктор базового класса.

Перед тем как перейти к решению системы уравнений, взглянем еще раз на устройство класса matrix2 2. В нем используется многое из базового класса matrix. Прежде всего - это оператор доступа (). Для манипуляций с элементами матрицы приходится использовать указатель па тскуишй объект (thi s), так как имя объекта нам пе известно.

Теперь все готово к решению системы зравнений. Соответствующая программа очень проста (листинг 10.2).



1 ... 23 24 25 [ 26 ] 27 28 29 ... 37

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