Усталені угоди

Колишні обєктно-орієнтовані мови не користувалися особливою популярністю через проблеми з ефективністю Так як C + + розроблявся, зокрема, для вирішення цих проблем, в нього було включено безліч деталей, що дозволяють писати більш ефективний код

Ініціалізація конструктора

Розглянемо мій приклад буфера Резонно уявити, що ви захочете задавати розмір при створенні буфера Один із способів реалізувати це додати нову функцію-член, що дозволяє робити зміни розміру буфера після створення обєкта Це знизило б ефективність, тому C + + і тут приходить вам на допомогу і дозволяє застосовувати декілька конструкторів

B моєму прикладі буфера я, ймовірно, задав би йстандартний конструктор

(Default constructor) той, який не приймає аргументів:

Buffer() { _data = new char [256] }

та іншої конструктор, який примать аргумент:

Buffer(int i) { _data = new char [i] }

Тепер у мене є два способи створення нового буфера Як і раніше, я можу створити стандартний буфер або в стеку, або в динамічній памяті:

Buffer myBuff

Buffer *pBuff = new Buffer

A можу створити особливий буфер, вказавши розмір:

Buffer myBuff(1024)

Buffer *pBuff = new Buffer (1000)

Хоча це виглядає злегка схожим на виклик функції, насправді це особливий спосіб ініціалізації змінної Використовуючи дану запис, ви можете так само ініціалізувати вбудовані типи:

int i = 3 / / Ініціалізація по-старому int j (4) / / Ініціалізація по-новому

Новий спосіб ініціалізації в деяких випадках має невелику перевагу в ефективності (Якщо ви використовуєте старий спосіб, деякі компілятори створюють тимчасовий обєкт, потім копіюють його в змінну, а потім видаляють тимчасовий обєкт при використанні нового запису завжди відбувається ініціалізація обєкта безпосередньо в змінної)

Використання

Зазвичай ви посилаєтеся на функцію-член, починаючи запис з імені обєкта Іноді, однак, вам потрібно явно вказати, якого класу належить потрібна функціячлен Це відбувається при визначенні функцій, про якому я розповім трохи пізніше, і в тому випадку, якщо вам необхідно тимчасово обійти звичайні правила успадкування Поряд із записом objectFoo () або objectPointer-> Foo () ви можете використовувати запис Class :: Foo () або навіть objectClass :: Foo (), хоча остання форма дещо незвична

Типовий приклад подібного використання представлений у розділі 21, у визначенні PlayNote :: SamplingRate (тобто, член SamplingRate класу PlayNote) B цьому випадку клас PlayNote хоче НЕ заміщати, а розширити визначення AudioAbstract :: SamplingRate Він реалізує подібний підхід, спочатку викликаючи батьківську версію, а потім проводячи будь-яку додаткову обробку

Визначення методів в окремих файлах

Програмісти C виробили угоду про розділення їх коду на модулі Кожен модуль складається зінтерфейсу(Interface), що зберігається в (заголовному) файлі з розширенням H, іреалізації(Implementation), що зберігається в (вихідному) файлі з розширенням С Це робиться для прискорення компіляції: компілятор

працює швидше, якщо читає тільки заголовні файли B моєму прикладі класу Buffer я розмістив усі функції-члени у визначенні класу, однак професійний код записується не так

Зазвичай визначення класу містить тільки оголошення функцій-членів, конструкторів і деструкторів Ha Насправді мій приклад в заголовному ( H) файлі виглядав би приблизно так:

class Buffer {

private:

char *_begin char *_end char *_data

public: Buffer()

~Buffer ()

void Insert (char а)

char Remove ()

}

Вихідний файл Cpp (що містить реалізацію) включав би в себе безпосередньо тіла функцій Звичайно, може бути багато класів, що містять функцію-член Insert (), тому необхідно використовувати відповідний запис з оператором :: для вибору потрібної функції-члена B цьому випадку у файлі вихідного програмного коду функції виглядали б так:

Buffer(){ _begin = _data _end = _data }

~Buffer () { delete[] _data}

void Insert (char а) {* _end + + = а}

char Remove () {return *_begin++ }

Зауважимо, що конструктори і деструктори не мають повертається типу

Подібне розділення створює незначні незручності при підтримці файлів вам слід постійно стежити за тим, щоб оголошення у вашому

. H-файлі та визначення в Срр-файлі були несуперечливі K щастя, більшість компіляторів з готовністю вкажуть вам на будь-які зявляються протиріччя

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = A Programmers Guide to Sound: Пер з англ М: ДМК Пресс, 2000 432 с, іл (Серія «Для програмістів»)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*