|
Программирование >> Инициализация объектов класса, структура
int *pi = new int(10); int *pia = new int[10]; while ( *pi < 10 ) { pia[*pi] = *pi; *pi = *pi + 1; delete pi; факту можно найти в разделе 3.9.2.) delete[] pia; 2.3. Объектный подход В этом разделе мы спроектируем и реализуем абстракцию массива, используя механизм классов С++. Первоначальный вариант будет поддерживать только массив элементов типа int. Впоследствии при помощи шаблонов мы расширим наш массив для поддержки любых типов данных. Первый шаг состоит в том, чтобы определить, какие операции будет поддерживать наш массив. Конечно, было бы заманчиво реализовать все мыслимые и немыслимые операции, но невозможно сделать сразу все на свете. Поэтому для начала определим то, что должен уметь наш массив: 1. обладать некоторыми знаниями о самом себе. Пусть для начала это будет знание собственного размера; 2. поддерживать операцию присваивания и операцию сравнения на равенство; 3. отвечать на некоторые вопросы, например: какова величина минимального и максимального элемента; содержит ли массив элемент с определенным значением; если да, то каков индекс первого встречающегося элемента, имеющего это значение; 4. сортировать сам себя. Пусть такая операция покажется излишней, все-таки реализуем ее в качестве дополнительного упражнения: ведь кому-то это может пригодиться. 5. Конечно, мы должны реализовать и базовые операции работы с массивом, а именно:Возможность задать размер массива при его создании. (Речь не идет о том, чтобы знать эту величину на этапе компиляции.) 6. Возможность проинициализировать массив некоторым набором значений. 7. Возможность обращаться к элементу массива по индексу. Пусть эта возможность реализуется с помощью стандартной операции взятия индекса. 8. Возможность обнаруживать обращения к несуществующим элементам массива и сигнализировать об ошибке. Не будем обращать внимание на тех потенциальных пользователей нашего класса, которые привыкли работать со встроенными массивами С и не считают данную возможность полезной - мы хотим создать такой массив, который был бы удобен в использовании даже самым неискушенным программистам на С++. Что делает следующий фрагмент кода? В чем состоит логическая ошибка? (Отметим, что операция взятия индекса ([]) правильно применена к указателю pia. Объяснение этому class classname { public: набор открытых операций private: закрытые функции, обеспечивающие реализацию следующим образом: }; class, public и private - это ключевые слова С++, а classname - имя, которое программист дал своему классу. Назовем наш проектируем1й класс IntArray: на первом этапе этот массив будет содержать только целые числа. Когда мы научим его обращаться с данными любого типа, можно будет переименовать его в Array. Определяя класс, мы создаем новый тип данных. На имя класса можно ссылаться точно так же, как на любой встроенный описатель типа. Можно создавать объекты этого нового статический объект типа IntArray типа аналогично тому, как мы создаем объекты встроенных типов: IntArray myArray; указатель на динамический объект типа IntArray IntArray *pArray = new IntArray; Определение класса состоит из двух частей: заголовка (имя, предваренное ключевым словом class) и тела, заключенного в фигурные скобки. Заголовок без тела может объявление класса IntArray служить объявлением класса. без определения его class IntArray; Тело класса состоит из определений членов и спецификаторов доступа - ключевых слов public, private и protected. (Пока мы ничего не будем говорить об уровне доступа protected.) Членами класса могут являться функции, которые определяют набор действий, выполняемых классом, и переменные, содержащие некие внутренние данные, необходимые для реализации класса. Функции, принадлежащие классу, называют функциями-членами или, по-другому, методами класса. Вот набор методов класса IntArray: Кажется, мы перечислили достаточно потенциальных достоинств нашего будущего массива, чтобы загореться желанием немедленно приступить к его реализации. Как же это будет выглядеть на С++? В самом общем случае объявление класса выглядит class IntArray { public: public: операции сравнения: #2b bool operator== (const IntArray&) const; bool operator!= (const IntArray&) const; операция присваивания: #2a IntArray& operator= (const IntArray&); int size() const; #1 void sort(); #4 int min() const; #3a int max() const; #3b функция find возвращает индекс первого найденного элемента массива или -1, ес элементов не найдено int find (int value) const; #3c private: дальше идут закрытые члены, обеспечивающие реализацию класса Номера, указанные в комментариях при объявлениях методов, ссылаются на спецификацию класса, которую мы составили в начале данного раздела. Сейчас мы не будем объяснять смысл ключевого слова const, он не так уж важен для понимания того, что мы хотим продемонстрировать на данном примере. Будем считать, что это ключевое слово необходимо для правильной компиляции программы. Именованная функция-член (например, miin()) может быть вызвана с использованием одной из двух операций доступа к члену класса. Первая операция доступа, обозначаемая точкой (.), применяется к объектам класса, вторая - стрелка (->) - к указателям на объекты. Так, чтобы найти минимальный элемент в объекте, имеющем тип IntArray, мы инициазация переменной min val должны написать: int min val = myArray.min(); i / / 1линимальн элементом myArray Чтобы найти минимальный элемент в динамически созданном объекте типа IntArray, мы должны написать: int min val = pArray->min(); (Да, мы еще ничего не сказали о том, как же проинициализировать наш объект - задать его размер и наполнить элементами. Для этого служит специальная функция-член, называемая конструктором. Мы поговорим об этом чуть ниже.) Операции применяются к объектам класса точно так же, как и к встроенным типам данных. Пусть мы имеем два объекта типа IntArray:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |