Использование встраиваемых функций в определении класса



 

Существует еще один способ создания встраиваемой функции. Он состоит в определении кода для функции‑члена класса в самом объявлении класса. Любая функция, которая определяется в объявлении класса, автоматически становится встраиваемой. В этом случае необязательно предварять ее объявление ключевым словом inline . Например, предыдущую программу можно переписать в таком виде.

 

 

Здесь функции get_i() и put_i() определены в теле объявления класса cl и автоматически являются встраиваемыми.

Обратите внимание на то, как выглядит код функций, определенных "внутри" класса cl . Для очень небольших по объему функций такое представление кода отражает обычный стиль языка C++. Однако можно сформатировать эти функции и таким образом.

 

 

В общем случае небольшие функции (как представленные в этом примере) определяются в объявлении класса. Это соглашение применяется и к остальным примерам данной книги.

Важно! Определение небольших функций‑членов в объявлении класса – обычная практика в С++‑программировании. И дело даже не в средстве автоматического встраивания, а просто в удобстве. Вряд ли вы встретите в профессиональных программах, чтобы короткие функции‑члены определялись вне их класса.

 

Массивы объектов

 

Массивы объектов можно создавать точно так же, как создаются массивы значений других типов. Например, в следующей программе создается класс display , который содержит значения разрешения для различных режимов видеомонитора. В функции main() создается массив для хранения трех объектов типа display , а доступ к объектам, которые являются элементами этого массива, осуществляется с помощью обычной процедуры индексирования массива.

 

 

При выполнении эта программа генерирует такие результаты.

Возможные режимы отображения данных:

 

 

Обратите внимание на использование двумерного символьного массива names для преобразования перечислимого значения в эквивалентную символьную строку. Во всех перечислениях, которые не содержат явно заданной инициализации, первая константа имеет значение 0 , вторая – значение 1 и т.д. Следовательно, значение, возвращаемое функцией get_res() , можно использовать для индексации массива names , что позволяет вывести на экран соответствующее название режима отображения.

Многомерные массивы объектов индексируются точно так же, как многомерные массивы значений других типов.

 

Инициализация массивов объектов

 

Если класс включает параметризованный конструктор, то массив объектов такого класса можно инициализировать. Например, в следующей программе используется параметризованный класс samp и инициализируемый массив sampArray объектов этого класса.

 

 

Результаты выполнения этой программы

 

 

подтверждают, что конструктору samp действительно были переданы значения от ‑1 до ‑4 .

В действительности синтаксис инициализации массива, выраженный строкой

 

 

представляет собой сокращенный вариант следующего (более длинного) формата:

 

 

Формат инициализации, представленный в программе, используется программистами чаще, чем его более длинный эквивалент, однако следует помнить, что он работает для массивов таких объектов, конструкторы которых принимают только один аргумент. При инициализации массива объектов, конструкторы которых принимают несколько аргументов, необходимо использовать более длинный формат инициализации. Рассмотрим пример.

 

 

В этом примере конструктор класса samp принимает два аргумента. В функции main() объявляется и инициализируется массив sampArray путем непосредственных вызовов конструктора samp() . Инициализируя массивы, можно всегда использовать длинный формат инициализации, даже если объект принимает только один аргумент (короткая форма просто более удобна для применения). Нетрудно проверить, что при выполнении эта программа отображает такие результаты.

 

Указатели на объекты

 

Как было показано в предыдущей главе, доступ к структуре можно получить напрямую или через указатель на эту структуру. Аналогично можно обращаться и к объекту: непосредственно (как во всех предыдущих примерах) или с помощью указателя на объект. Чтобы получить доступ к отдельному члену объекта исключительно "силами" самого объекта, используется оператор "точка" . А если для этого служит указатель на этот объект, необходимо использовать оператор "стрелка" . (Применение операторов "точка" и "стрелка" для объектов соответствует их применению для структур и объединений.)

Чтобы объявить указатель на объект, используется тот же синтаксис, как и в случае объявления указателей на значения других типов. В следующей программе создается простой класс Р_ехample , определяется объект этого класса ob и объявляется указатель на объект типа Р_ехample с именем р . В этом примере показано, как можно напрямую получить доступ к объекту ob и как использовать для этого указатель (в этом случае мы имеем дело с косвенным доступом).

 

 

Обратите внимание на то, что адрес объекта ob получается путем использования оператора что соответствует получению адреса для переменных любого другого типа.

Как вы знаете, при инкрементации или декрементации указателя он инкрементируется или декрементируется так, чтобы всегда указывать на следующий или предыдущий элемент базового типа. То же самое происходит и при инкрементации или декрементации указателя на объект: он будет указывать на следующий или предыдущий объект. Чтобы проиллюстрировать этот механизм, модифицируем предыдущую программу. Теперь вместо одного объекта ob объявим двухэлементный массив ob типа P_example . Обратите внимание на то, как инкрементируется и декрементируется указатель р для доступа к двум элементам этого массива.

 

 

Вот как выглядят результаты выполнения этой программы.

 

 

Как будет показано ниже в этой книге, указатели на объекты играют главную роль в реализации одного из важнейших принципов C++: полиморфизма.

 

Ссылки на объекты

 

На объекты можно ссылаться таким же образом, как и на значения любого другого типа. Для этого не существует никаких специальных инструкций или ограничений. Но, как будет показано в следующей главе, использование ссылок на объекты позволяет справляться с некоторыми специфическими проблемами, которые могут встретиться при использовании классов.

 


Дата добавления: 2018-09-22; просмотров: 479; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!