Навигация
Главная
Поиск
Форум
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
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
Имитационное мо... 60099
Реклама
Сейчас на сайте
Гостей: 4
На сайте нет зарегистрированных пользователей

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

Информационная система - транспортный парк на Turbo Pascal (База данных)...
Расчет размера дохода на одного человека в Turbo Pascal
Программа тестирования и обучающая программа по математике на Turbo Pasc...

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Массивы и классы, поля-массивы в классе
Массив представляет собой группу элементов одного типа, каждый из которых имеет номер. Как мы видели в главе 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 19:24:54 · 0 Комментариев · 10426 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Простой пример ка...
Xrumer 4 Platinum...
Язык программиров...
Клавиатурный трен...
MicroGPSS Studen ...
CarGame [Исходник...
EditButton
AID антивирус
Пример создания W...
Borland C++Builde...
Х. М. Дейтел, П. ...
Win-Prolog 3.618
Язык программиров...
Искусство програм...
Платформа програм...
Моделирование дви...
Архив Апгрейтов с...
Программирование ...
ShadelLabel
Report

Топ загрузок
Приложение Клие... 100519
Delphi 7 Enterp... 91130
Converter AMR<-... 20098
GPSS World Stud... 15145
Borland C++Buil... 12883
Borland Delphi ... 9074
Turbo Pascal fo... 7105
Калькулятор [Ис... 5158
Visual Studio 2... 5028
FreeSMS v1.3.1 3557
Случайные статьи
ЭТАП 1. ИДЕНТИФИКА...
средствами IPSecШи...
Освобождение выдел...
Библиотека Matrix
Техническая библио...
Составление алгори...
Функции
Организация информ...
Большие объекты
Примеры программир...
Задача о коммивояж...
Дополнительная пан...
Абонентские или ка...
ЯЧЕЙКИ В GPSS
Добавление узлов к...
Сборка
своему RAD1 US-сер...
Новейший гибкий O...
При дальнейшей про...
Протоколы распреде...
Элемент ввода text...
Умеете ли вы делат...
Целочисленный арг...
3. Драйвер IPSec п...
Основные принципы ...
Статистика



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


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