Бьерн Страуструп.
Язык программирования С++
26
char c1 = pop ( s1 );
destroy_stack ( s2 );
//
неприятная ошибка
// ошибка: забыли уничтожить s1
s1 = s2;
// это присваивание является по сути
// присваиванием указателей,
// но здесь s2 исп-ся после уничтожения
}
Иными словами, концепция модульности, поддерживающая парадигму упрятывания данных, не
запрещает такой стиль программирования, но и не способствует ему.
В
языках Ада, Clu, С++ и подобных им эта трудность преодолевается благодаря тому, что пользователю
разрешается определять свои типы, которые трактуются в языке практически так же, как встроенные. Такие
типы обычно называют абстрактными типами данных, хотя лучше, пожалуй, их называть просто
пользовательскими. Более строгим определением абстрактных типов данных было бы их математическое
определение. Если бы удалось его дать, то, что мы называем в программировании типами, было бы
конкретным представлением действительно абстрактных сущностей. Как определить "более абстрактные"
типы, показано в $$4.6. Парадигму же программирования можно выразить теперь так:
Определите, какие типы вам нужны; предоставьте полный набор операций для каждого типа.
Если нет необходимости в
разных объектах одного типа, то стиль программирования, суть которого
сводится к упрятыванию данных, и следование которому обеспечивается с помощью концепции
модульности, вполне адекватен этой парадигме.
Арифметические типы, подобные типам рациональных и комплексных чисел, являются типичными
примерами пользовательских типов:
class complex
{
double re, im;
public:
complex(double r, double i) { re=r; im=i; }
complex(double r) //
преобразование float->complex
{ re=r; im=0; }
friend complex operator+(complex, complex);
friend complex operator-(complex, complex); //
вычитание
friend complex operator-(complex) //
унарный минус
friend complex operator*(complex, complex);
friend complex operator/(complex, complex);
//
...
};
Описание класса (т.е. определяемого пользователем типа) complex задает представление
комплексного числа и набор операций с
комплексными числами. Представление является частным
(private): re и im доступны только для функций, указанных в описании класса complex. Подобные
функции могут быть определены так:
complex operator + ( complex a1, complex a2 )
{
return complex ( a1.re + a2.re, a1.im + a2.im );
}
и использоваться следующим образом:
void f ()
{
complex a = 2.3;
complex b = 1 / a;
complex c = a + b * complex ( 1, 2.3 );
//
...
c = - ( a / b ) + 2;
}
Бьерн Страуструп.
Язык программирования С++
27
Большинство модулей (хотя и не все) лучше определять как пользовательские типы.
Достарыңызбен бөлісу: