|
Программирование >> Унарные и бинарные операторы
Это значит, что, встретив запись а++++, компилятор независи.мо от типа объекта должен выдать сообщение об ошибке-. В реальности так бывает не всегда. 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).
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |