Глава 10. Объектно-ориентированное программирование
f o r ( i n t i =0; i < s i z e ; i ++)
m[ i ]=m1 .m[ i ] ;
return ∗ t h i s ;
}
m a t r i x : : ~ m a t r i x ( )
{
delete [ ] m;
}
double m a t r i x : : g e t _ v a l ( s i z e _ t i , s i z e _ t j )
{
//получить значение элемента матрицы в позиции [i,j]
return m[ i ∗ width+j ] ;
}
void m a t r i x : : s e t _ v a l ( s i z e _ t i , s i z e _ t j , double v a l )
{
//устанавливаем значение элемента матрицы в позиции [i,j]...
//...если координаты не превышают размер матрицы
i f ( ( i }
main ( )
{
m a t r i x a ( 2 , 2 ) ; //объявляем матрицу размерности 2 х 2
a . s e t _ v a l ( 0 , 0 , 1 0 0 ) ; //устанавливаем a[0,0] = 100
m a t r i x b=a ; //присваиваем матрицу
b . s e t _ v a l ( 0 , 0 , 2 0 0 ) ; //устанавливаем b[0,0] = 200
c o u t << " a [ 0 , 0 ] = " << a . g e t _ v a l ( 0 , 0 ) << " ; " << " b [ 0 , 0 ] = " << a . g e t _ v a l
( 0 , 0 ) << e n d l ;
}
Внимательный читатель может заметить в коде примера необычную особен-
ность. И конструктор копирования, и оператор присваивания получают доступ
к закрытой части переданного объекта m1. На самом деле это вполне естествен-
но. Вспомним: переменные, объявленные в закрытой секции класса, доступны
только для методов этого же класса (а не «этого же объекта»). Иными словами,
объекты одного класса могут получать доступ к закрытым членам друг друга,
хотя используется это не так часто.
10.3.3
Пример: класс spatial_vector в сборе
Прежде чем закончить разговор о перегрузке операторов и передаче объек-
тов, приведём ещё один пример, наглядно иллюстрирующий, что иногда передача
объекта по значению может нести практическую пользу. Рассмотрим финаль-
ный вид класса spatial_vector с перегруженными операторами ввода-вывода,
инкремента и декремента обеих форм, а также операторами сложения и вычи-
тания.
#include
#include |