Главная » Программирование звука » Вперед к объектно-ориентированному программированию

0

Объект  (object)   это,  на  самом  деле,  просто  причудливое  название  структуры  (struct).  Важная  особенность  заключается  в  том,  что  объект,  помимо  данных, может  содержать  функции.  Вот  пример  буфера,  но  с  двумя  функциями-членами (member functions), которые также называют методами (methods).

struct Buffer { char *_begin; char *_end;

char _data[256];

Buffer() { _begin = _data; _end = _data; };

void Insert (char a) { *_end++ = a ;}

char Remove () {return *_begin++ ; }

};

Вы  используете  эти  функции-члены  абсолютно  так  же,  как  и  другие  члены структуры, применяя операторы -> и . (точка). Например:

Buffer myBuff;

myBuff.Insert("a") ;

Buffer *pBuff = new Buffer;

pBuff->Insert ("b");

И  снова  повторю:  С++  позволяет  вам  объявлять  новые  переменные  в  любом месте, а не только в начале блока. Это делает многие программы более понятными

для  восприятия,  так  как  вы  можете  определять  новые  переменные  в  непосредственной  близости  от  места  их  использования.  B  частности,  вы  можете  объявить новую переменную в инициализационной части оператора for:

for (int i=0; i<10; i++) { // Добавляем  10 символов  "а". myBuff.Insert ("a");

}

Если у вас уже есть структура Stack, которая имеет функцию-член Insert(),

вы можете вызвать ее таким же способом:

Buffer myBuff; Stack myStack;

myBuff.Insert("a");         // Вставляем  "а" в  буфер.

myStack.Insert("a");        // Вставляем  "а" в  стек.

Возможность  повторного  использования  одного  и  того  же  имени,  то  есть  полиморфизм   (polymorphism),   спасает   при   разработке   больших   программ.   Например,   в   моем   аудиоинструментарии   почти   каждый   объект   имеет   функцию-член GetSamples. Так как в каждом из них она преследует одну и ту же цель, гораздо удобнее повторно применить то же самое имя, чем постоянно заботиться о придумывании новых.

C++ позволяет повторно использовать имена и другим важным способом. Даже внутри одной структуры вы можете иметь более одного метода с одним и тем же именем. Например, если вы хотите разместить символьные строки в буфере, следует определить и Insert(char a), и Insert(char *а). Используя эти определения, вы могли бы написать myBuff.Insert(‘а’) или myBuff.Insert(‘abcdef’), а компилятор проверил  бы  типы  аргументов  и вызвал  бы  соответствующую функцию.  Возможность  перегрузки  (overload)  имени  функции  применима  и  к  обычным функциям, не только к функциям-членам.

Способность C++ выбирать нужную функцию в соответствии с типом аргумента это одна из составных частей общей концепции всего языка безопасного типизированного  (type-safe)  программирования.  Одним  из  примеров  данного  различия между C и C++ является трактовка (бестипового) указателя *void. Оба языка позволяют  присваивать  значение  любого  указателя  переменной  типа  *void.  Однако C также разрешает вам свободно присваивать указатель void* любому другому указательному типу, в то время как C++ требует, чтобы вы использовали явное приведение  типов.  C++  также  проверяет  типы  аргументов  функции  и  возвращаемого значения  (даже  при  передаче  одними  файлами  другим)  и  накладывает  ряд  других ограничений,  призванных  помочь  вам  избежать  некоторых  распространенных  программных ошибок.

Источник: Кинтцель Т.  Руководство программиста по работе со звуком = A Programmer’s Guide to Sound: Пер. с англ. М.: ДМК Пресс, 2000. 432 с, ил. (Серия «Для программистов»).

По теме:

  • Комментарии