Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 7
На сайте нет зарегистрированных пользователей

Пользователей: 13,368
новичок: Goosprin
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Диплом RSA, ЭЦП, сертификаты, шифрование на C#
Моделирование работы участка термической обработки шестерен на GPSS + По...
Моделирование процесса обеспечивающего надежность функционирования АСУ Т...

Массивы и классы, поля-массивы в классе
Массив представляет собой группу элементов одного типа, каждый из которых имеет номер. Как мы видели в главе 1, реализовав некоторый класс, мы получаем возможность объявлять массивы объектов данного типа (см. листинг 1.19). Нужно только помнить, что для создания каждого элемента массива вызывается конструктор без аргументов. При наличии в классе конструктора инициализации можно инициализировать элементы массива обычным образом: для каждого элемента будет вызван конструктор инициализации. Использовать такой массив разрешается точно так же, как и массив объектов встроенных типов.
Однако языку С++ массивы достались в наследство от С; это — очень простые, даже примитивные конструкции. При использовании массивов обычно требуется писать довольно много кода, который к тому же подвержен ошибкам — любой программист вам это подтвердит. Такое положение связано в первую очередь с тем, что при обращении к элементам массива по индексу величина индекса по умолчанию никак не проверяется. Поэтому очень часто возникает ошибка выхода за границу массива. Во-вторых, при передаче массива в качестве параметра и при возврате в качестве результата функция на самом деле оперирует не массивом, а адресом его первого элемента. Поэтому надежность программ, оперирующих массивами, оставляет желать лучшего.
Кардинально изменить положение позволяют классы. Рассмотрим «взаимоотношения» массивов и классов подробнее.

Поля-массивы в классе
До сих пор в качестве полей мы использовали только скалярные переменные. Но в С++ нет запрета на объявление в классе поля-массива. Естественно, размер класса с полем-массивом увеличивается на размер массива. Однако использование массива в классе недостаточно хорошо отражено в стандарте. Это вызывает

многочисленные вопросы, особенно связанные с инициализацией1. Мы начнем разбираться с этими вопросами на самом простом примере, в котором объявляются и инициализируются несколько полей-массивов (листинг 4.1).

Листинг 4.1. Поля-массивы в классе
class Arrays
{ int m0[10];
static const unsigned int k = 10;
enum { n = 10 };
int ml[k];
int m2[n];
public:
ArraysO // конструктор
{ for (int i = 0; i < k; ++i) m0[i]=ml[i]=m2[i]=0;
}
};



В классе Arrays объявлено три поля-массива: m0, ml и m2. Как видим, задать количество элементов массива можно либо явной константой, либо константным выражением со статическими и (или) перечислимыми константами, причем константы должны быть определены раньше массива. Задавать количество элементов поля-массива обязательно.
Нельзя задать количество элементов как значение другого поля, заполняемого конструктором, даже если это поле константное. Например, пусть в классе объявлены следующие поля:
const int k; int m[k];



В этом случае система Visual C++.NET 2003 выдает ошибку компиляции С2327, которая сигнализирует о том, что к в данном случае не является ни статической константой, ни константой перечислимого типа.
Конструктор без аргументов АггауО обнуляет массивы, выполняя цикл в теле. Такой способ инициализации поля-массива — в теле конструктора — является наиболее простым и позволяет присваивать элементам массива любые значения. Однако наиболее часто выполняется обнуление, поэтому для массивов разрешается применять инициализацию нулем- Тогда наш конструктор выглядит значительно проще:
ArraysO: m0(), ml(), m2() {}



1 Удивительно, но мне не удалось обнаружить в стандарте явного определения способов инициализации полей-массивов. И в известной мне литературе по этому вопросу тоже практически ничего не написано.
Для массива объектов некоторого типа такая запись означает вызов конструктора по умолчанию (без аргументов), и не забудьте, что этот вызов выполняется для каждого элемента массива.
К сожалению, применение списков инициализации для полей-массивов этим и ограничивается — в скобках нельзя ничего указывать. Например, при написании следующей конструкции система Visual C++.NET 2003 выдаст сообщение об ошибке С2536, сигнализируя о том, что явная инициализация массивов запрещена:
ArraysO: m0(l, 2 ,3 ,4,5). ml(), m2() {}



Попытки написать в скобках некоторое одиночное выражение (например, вызов функции, заполняющей массив) компилятор отвергает по той же причине.
Явная инициализация не проходит даже для символьных массивов. Например, объявим в классе Arrays символьный массив
char s[4] ;



После этого попытаемся в списке инициализации конструктора присвоить этому массиву символьную константу:
ArraysO: m0(), ml(), m2(), s("abc") {}



Тогда в системе Visual C++.NET 2003 мы получим сообщение об ошибке:
error С2536: 'Arrays::Arrays::s' :
cannot specify explicit initializer for arrays



Это сообщение говорит о том, что нельзя определять явный инициализатор для массивов.
Тем не менее можно задать в классе указатель на символ: char *s:
Затем можно инициализировать указатель символьной константой в списке инициализации конструктора, как было показано ранее.
Как это ни странно, но большие проблемы возникают при попытках объявить в классе константный массив встроенного типа! Как мы уже выяснили, константы нельзя инициализировать в теле конструктора, значения им присваиваются только в списке инициализации конструктора. Однако для константного массива встроенного типа не работает даже инициализация нулем.
ПРИМЕЧАНИЕ
Не проходит и отмена константности. Например, зададим массив т0 как константный, а в теле конструктора определим инициализацию в цикле:
for (int i = 0: i < 10: ++i) const_cast<int>(m0[i]) = 0:



Однако и Visual C++.NET 2003, и Borland С++ Builder 6 отказываются компилировать такой цикл.
Этот вопрос практически не отражен в стандарте, поэтому компиляторы ведут себя по-разному. В системе Visual C++.NET 2003 выдается ошибка компиляции С2439, a Borland С++ Builder 6 выдает только предупреждение W8038 о том, что массив не инициализируется.
Удивительно, но для константного массива из объектов невстроенного типа задавать инициализацию нулем разрешается. Для этого в классе должен быть определен конструктор без аргументов, который вызывается для инициализации каждого элемента константного поля-массива. Например, вполне можно инициализировать константный массив денег:
const ТМопеу ss[10];



Для этого достаточно задать в списке инициализации конструктора инициализацию нулем ss (). Как реально инициализируется такой массив, конечно, зависит от реализации конструктора по умолчанию.
Опубликовал Kest September 16 2013 15:24:54 · 0 Комментариев · 13165 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Printgrid
База данных фильм...
Х. М. Дейтел, П. ...
Советы по Delphi
MPTools
WordReport
iChat v.7.0 Final...
База каталогов ( ...
Заставка. Изображ...
Cooltray
Пример создания W...
Cтатьи Королевств...
Calendar
Dnavigator
Игра PackMan
CLR via C#
AID антивирус
С. Г. Горнаков - ...
Синтаксический ан...
iComm v.6.1 - выв...

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97833
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10291
Turbo Pascal fo... 7373
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Перегрузка операци...
Комплексные числа
Первая попытка зап...
Настройка плагина ...
Листинг 5.5. Автом...
Рекурсивное вычисл...
В чем отличие ANI/...
Типичные примеры в...
Оптимизация режим...
Перевод на машинны...
Система воспроизве...
Создание БД
Отображение параме...
Команда DIV
Сверточные (рекурр...
Удостоверьтесь, чт...
Вы используете кли...
Реализация протоко...
Игровые автоматы....
Элементы протокола
Числа и серьезные ...
Средства отладки
Где взять денег в ...
Основы сетевой рек...
Обнаружение пробле...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?