Г. Шилдт - Полный справочник по C++ (1109478), страница 50
Текст из файла (страница 50)
при его объявлении. Следовательно, объявление объекта в языке С++ — это не пассивная запись, а активный процесс. В языке С++ объявление является выполняемым оператором. Это различие носит вовсе не академический характер. Код, с помощью которого конструируется обьект, может быть довольно важным. Для глобальных и статических локальных объектов конструкторы вызываются лишь однажды. При объявлении локальных объектов конструкторы вызываются каждый раз при входе в соответствующий блок. Антиподом конструктора является дес/лруюлор. Во многих ситуациях объект должен выполнить некоторос действие или действия, которые уничтожат его.
Локальные объекты создаются при входе в соответствующий блок, а при выходе из него они уничтожаются. При разрушении объекта автоматически вызывается его деструктор. Для этого существует несколько причин. Например, обьект должен освободить занимаемую им память или закрыть файл, открытый им ранее. В языке С++ эти действия выполняет деструктор.
Имя деструктора должно совпадать с именем конструктора, но перед ним ставится знак - (гильда). Рассмотрим класс аеас)<, содержащий конструктор и деструктор. (У пите, что на самом деле класс аеас)е не нуждается в деструкторе, здесь он приведен в качестве иллвхтрации.) !/ Объявление класса зеасх. с1авз вгасх ( (пе веск[БХЕЕ); ъпс сов> рц)з11с: зсасК(); // Конструктор -всасКП ! /! деструктор уоЫ рцв)т(зпе 5.); апс рор(); ): // Конструктор класса веасх всасх::всаск() ( Сов = 0; соцс « "Стек инициализирован1п"; ) /! деструктор класса всасх всасх::-веасх О соцс « "Стек уничтожен1п"; Учтите, что конструкторы и деструкторы не возвращают никаких значений.
Проиллюстрируем работу конструктора и деструктора с помощью новой версии программы аеас)<. Обратите внимание на то, что теперь функция 1п3.е() не нужна. // Использование конструктора и деструктора. В1пс1цое <1овс геев> издпд павеврасе вЫ! Вс)вкупе Я1ЕЕ 100 Часть (!. Язык С++ сеепхп 0; 1 Результат работы программы выглялит так. Стек иииииаливирован Стек иииииализирован 3 1 4 2 Стек уничтожен Стек уничтожен ~3 Ключевые слова языка С++ Стандарт языка С++ содержит 63 ключевых слова. Они приведены в табл. 11.1, Таблица 11.1. Клкнваые слова языка С+1 Ьоо1 сЬас сопе1ппе Ь еах с1авв апео саесЬ авк зь аупвпьс санс епросс Есс сопвс ав1есв сапве саве ао аоиЬ1е вир11сьь Е1оаь е1ве ехьехп Есаепа кпе етпя Еа1ве лп1ьпе пвяееатсе рсе своева хеопса веаььс Ееяр1аье еяу сп1оп га суреаее ипвьдпеа со1ас11е еурепюйе еьсииа1 Ь11е пв5.пд исЬас с Структура программы на языке С++ Программа на языке С++ имеет такой общий вил.
адиреитивы гпсгиде обьявяенил бшпвых классов пбьявления производных классов прототипы пбычньп фрнлпий зпе паап() гl 1 определения обычных сбьняиил В большинстве крупных проектов все объявления классов должны размещаться в отдельном заголовочном файле, который может включаться в кажлый модуль. Олнако общая структура программы остается неизменной. В оставшихся главах мы более подробно рассмотрим описанные выше свойства, а также другие аспекты языка С++. Часть Я. Язык С++ псе роЬ11с вЬосе веасхс саве Сыав восо 1опд оресаеос хедьвеес вадпеа всспсь зпссапле рсьивее сеьпсесрсее саве в1веок ввзесь В основе объектно-ориентированного программирования на языке С++ лежит понятие класса.
Класс опрелеляет природу объекта и является основным механизмом инкапсуляции. В этой главе мы рассмотрим классы и объекты более подробно. ):~ Классы Классы создаются с помощью ключевого слова озава. Объявление класса определяет новый тип, связывающий код и данные между собой. Таким образом, класс является логической абстракцией, а объект — ее физическим воплощением. Иными словами, обьект — это экземпляр класса. Объявление класса очень похоже на объявление структуры. В главе! ( был продемонстрирован упрощенный вид такого объявления. Ниже приводится полная общая форма объявления класса, который не является наследником никакого другого класса. с1авв иик-кпасеа зикр ьипые донн ьы и функции спецификатпр доступа: данные и функции спец ификатар„доступа: данные и функции // епецификатар доступа: данные и функции ) еписак абьектае; Список абаектае указывать не обязательно.
Он просто позволяет объявлять объекты класса. В качестве снефицикатора доступа используется одно из трех кщочевых слов языка С++; риЬ11с рк3таее ркоеесеед По умолчанию функции и данные, обьявленные внутри класса, считаются закрытыми и доступны лишь функциям — членам этого класса. Спецификатор рпЪ11с открывает доступ к функциям и данным класса из других частей программы.
Спецификатор доступа ркоеесееа необходим только при наследовании классов (см. главу 15). Зона влияния спецификатора доступа простирается до следующего спецификатора или до конца объявления файла. Внутри объявления класса спецификаторы доступа можно чередовать в произвольном порядке. Например, некоторые члены класса можно сделать открытыми, а затем вновь перейти к объявлению закрытых переменных и функций. Проиллюстрируем сказанное следующим примером. цупс1чде <довггеаге> М1пс1оде ссвсктпд> овьпд паюеврасе всд; с1авя еюр1оуее ( с(1аг пате(801; // Закрыт по умолчанию рчЫгс: чодд рчспаюе(сваг "и]," // Открытые члены чоЫ деспаюе(с(заг *п)г рту>все: дочЬ1е ыаае( // Снова объявляются закрытые члены га Часть И. Язык С++ риЫас: чоас) рпсыаде ИовЫе ы); /У Вновь объявляются открытые члены йоиЫе девыаде О; чоьг) етр1оуее::рвгпаюе(сЬаг *и) ( згссру(папе, и); ) чоас) еыр1оуее::деггаме(сЬаг *и) ( вьгсру(п, папе); ) чо1с) етр1оуее::ритиаде(г)опЬ1е ы) ( ыаде = из г)опЫе етр1оуее:."девыадеО геввси ыаде; апв яа1пО ( епр1оуее Сегб сЬаг паее[801г Сег).ретивые("Тел джонс" ); вес).рпсыаде(75000); Сег).девивле(паве); свив « пате « " зарабатывает 8"; совв « Сег).девыадеО « " за год.
левши 0; Здесь класс емр1оуее используется для хранения имени сотрудника и величины его оклада. Обратите внимание на то, что спсцификатор доступа рвЫас использован дважды. Несмотря на то что ограничений на использование спсцификаторов доступа нот, зтои возможностью нс стоит злоупотреблять. Она полезна лишь для визуализации разных групп переменных, связанных между собой, и улучшает наглядность программы. Однако компилятору все равно, как сгруппированы данные внутри объявления класса. Многие программисты считают более естественным группировать все открытые, зашишенныс и закрытые данные, используя не более одного раздела каждого вида. Например, большинство программистов записало бы объявление класса еар1оуее так, как показано ниже.
с1авв еыр1оуее ( сбаг паве(801; г)оиЬ1е чаде; рвЫ).с: чо1г) ритпате(сЬат *и); чово девпаюе(сиат *п); чоай рисыаде(г)оиЫе ы); йопЫе десыадеО > Глава 12. Классы и объекты М(пс1ог)е <ъояггеае> ояъпд пвзьеярасе ягс); с1аяя тус1ая роЬ11с: ъгс 1, 'з, ): Кз // Доступны из лпбой точки программы ъпе паьп() ( тус1аяя а, Ь; а.ъ = 100 а.б = 4; а.х = а.й // Переменные г, б и к доступны * а.5' Ь.)< = 12 // Напомним, что переменные а.к и Ь.)с // принадлежат разным объектам )< «" "«Ь.ьм соог «а гегогп 0; Связь между структурами и классами Структуры являются наслелием языка С. Как мы уже знаем, синтаксические конструкции класса и структуры очень похожи.
Однако связь между структурой и классом намного теснее, чем кажется на первый взгляд. В языке С++ роль структуры была значительно расширена. Фактически она стала альтернативой классу. Единственное различие между структурой и классом заключается в том„что все члены структуры по умолчанию считаются открытыми, а все члены класса — закрытыми. Во всех других отношениях структуры и классы эквивалентны. Иначе говоря, в языке С++ структура является разновидностью класса. Рассмотрим пример программы, в которой структура используется в качестве класса, контролирукяцего доступ к строке.
// Использование структуры я качестве класса. ()1пс1пс)е <гояггеае> $(пс1пг)е <сяеггпд> Часть й. Язык С++ Функции, объявленные внутри класса, называются функциями-членами. Они имеюч. доступ ко всем элементам своего класса, включая закрытые члены. Переменные, объявленные внутри класса, называются переменными-членами или даннымн-членами.
(Используется та|оке термин зкзвмлллр переменной.) Итак, любой злемент класса называется членам класси. Существует несколько ограничений на применение членов класса. Нестзтические чле; ны класса не могут иметь инициализатор. Объявление класса не может содержать объявление своего объекта. (Хотя членом класса может быть указатель на объект данного класса.) Члены класса не могут объяшиться с ключевыми словами аппо. екеегп и ген.яеег.
Как правило, все данные-члены объявляют закрытыми. Это обеспечивает инкапсуляцию данных. Однако существуют ситуации, в которых некоторые переменные следует обьявлять открытыми. (Например, если некоторая переменная используется очень часто, открьггый доступ выполняется намного быстрее.) Синтаксическая конструкция для доступа к открытому члену класса ничем не отличается от вызова функции-члена: указывается имя объекта, оператор "." и имя переменной. Рассмотрим простой пример. ця1пя паыеврасе все; яътцсс тувст ( чово ЬцаЫяг с(спас "в)," // Открытый член чово впоивегО: ртачаее: // Закрытый член онат век[255); ) чо(б ыувет::ЬцбЫвг е(онат *я) 1Г(!*я) *ест = ' 10'; // инициализация строки е1яе ястсас(вст, я); ) чово пуяет::вноивег О ( соцс « ягт « "~п"; ) ЫС пасв О ( муяет я; в.Ьц11овет(""); // Инициализация я.Ьц1Ывсх("Всем "); в.Ьц11йвтт("привет!" ); я.вноивтт() тегцгп О; Эта программа выводит на экран строку "всем 1тривет.' ".
Класс шувек можно переписать с помощью ключевого слова с1авв. с1аяя пуяег ( сиат вес[255); рцЬ11с: чоа<) Ьц11овст(спет *в); // Открыта й член исай вноиветО; ) Возникает есгественный вопрос: "Зачем в языке С++ прелусмотрсны два эквивалентных ключевых слова вехпое и о1авв?". 3|а мнимая избыточность объясняется несколькими причинами. Во-первых, не нужно ограничивать возможности структур.