Читаем Программирование полностью

  // деструктор и присваивание

  T& operator[] (int n); // доступ: возвращает ссылку

  const T& operator[] (int n) const;

  T* data() { return elem; } // преобразование в тип T*

  const T* data() const { return elem; }

  int size() const { return N; }

}

Мы можем использовать класс array (см. также раздел 20.7) примерно так:

array gb; // 256 целых чисел

array ad = { 0.0, 1.1, 2.2, 3.3, 4.4, 5.5 }; // инициализатор!

const int max = 1024;

void some_fct(int n)

{

  array loc;

  array oops;         // ошибка: значение n компилятору

                              // неизвестно

  // ...

  array loc2 = loc; // создаем резервную копию

  // ...

  loc = loc2;                 // восстанавливаем

  // ...

}

Ясно, что класс array очень простой — более простой и менее мощный, чем класс vector, — так почему иногда следует использовать его, а не класс vector? Один из ответов: “эффективность”. Размер объекта класса array известен на этапе компиляции, поэтому компилятор может выделить статическую память (для глобальных объектов, таких как gb) или память в стеке (для локальных объектов, таких как loc), а не свободную память. Проверяя выход за пределы диапазона, мы сравниваем константы (например, размер N). Для большинства программ это повышение эффективности незначительно, но если мы создаем важный компонент системы, например драйвер сети, то даже небольшая разница оказывается существенной. Что еще более важно, некоторые программы просто не могут использовать свободную память. Такие программы обычно работают во встроенных системах и/или в программах, для которых основным критерием является безопасность (подробно об этом речь пойдет в главе 25). В таких программах массив array имеет много преимуществ над классом vector без нарушения основного ограничения (запрета на использование свободной памяти).

Поставим противоположный вопрос: “Почему бы просто не использовать класс vector?”, а не “Почему бы просто не использовать встроенные массивы?” Как было показано в разделе 18.5, массивы могут порождать ошибки: они не знают своего размера, они конвертируют указатели при малейшей возможности и неправильно копируются; в классе array, как и в классе vector, таких проблем нет. Рассмотрим пример.

double* p = ad;        // ошибка: нет неявного преобразования

                       // в указатель

double* q = ad.data(); // OK: явное преобразование

template void printout(const C& c) // шаблонная функция

{

  for (int i = 0; i

Эту функцию printout() можно вызвать как в классе array, так и в классе vector.

printout(ad); // вызов из класса array

vector vi;

// ...

printout(vi); // вызов из класса vector

Это простой пример обобщенного программирования, демонстрирующий доступ к данным. Он работает благодаря тому, что как для класса array, так и для класса vector используется один и тот же интерфейс (функции size() и операция индексирования). Более подробно этот стиль будет рассмотрен в главах 20 и 21. 

<p id="AutBody_Root354"><strong>19.3.5. Вывод шаблонных аргументов</strong></p>

 Создавая объект конкретного класса на основе шаблонного класса, мы указываем шаблонные аргументы. Рассмотрим пример.

array buf; // для массива buf параметр T — char, а N == 1024

array b2;  // для массива b2 параметр T — double, а N == 10

  Для шаблонной функции компилятор обычно выводит шаблонные аргументы из аргументов функций. Рассмотрим пример.

template void fill(array& b, const T& val)

{

  for (int i = 0; i

}

void f()

{

  fill(buf, 'x'); // для функции fill() параметр T — char,

                  // а N == 1024,

                  // потому что аргументом является объект buf

  fill(b2,0.0);   // для функции fill() параметр T — double,

                  // а N == 10,

                  // потому что аргументом является объект b2

}

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных