246071-Либерти-Освой-самостоятельно-С-за-21-день (852741), страница 28
Текст из файла (страница 28)
Переменной Area присваивается значение, возвращаемоефункцией-членомGetArea()классаRectangle.Клиент класса Rectangle может создать объект Rectangle и возвратить его площадь, незаботясьонюансахвыполненияфункцииGetArea().В листинге 6.8 показано содержимое заголовочного файла Rect.hpp. Только лишьпросмотрев заголовочный файл, который содержит объявление класса Rectangle, программистбудетзнать,чтофункцияGetArea()возвращаетзначениетипаint.ПользователяклассаRectangleне волнуют "производственные" секреты функции GetArea(). И в самом деле, автор классаRectangle мог бы спокойно изменить выполнение функции GetArea(), и это бы не повлияло напрограммы,использующиеклассRectangle.Вопросыиответы:Каковоразличиемеждуобъявлениемиопределением?Объявление вводит имя некоторого объекта, но не выделяет для него память, а вот спомощьюопределениякакразивыделяетсяпамятьдляконкретногообъекта.СтруктурыОчень близким родственником ключевого слова class является ключевое слово struct,котороеиспользуетсядляобъявленияструктуры.ВязыкеC++структура—этототжекласс,носоткрытымипоумолчаниючленами.Структуруможнообъявитьподобнотому,какобъявляетсякласс, наделив ее такими же переменными-членами и функциями.
И в самом деле, еслиисповедовать хороший стиль программирования и всегда в явном виде объявлять открытые изакрытыеразделыкласса,тоникакихотличийнедолжнобыть.Попытаемсяповторноввестисодержимоелистинга6.8сучетомследующихизменений:•встроке3заменимобъявлениеclassPointобъявлениемstructPoint;•встроке17заменимобъявлениеclassRectangleобъявлениемstructRectangle.Теперьвновьзапустимнашупрограммуисравнимрезультаты.Приэтомникакойразницывызаметитьнедолжны.ПочемудваключевыхслованесутодинаковуюсмысловуюнагрузкуВы, вероятно, удивлены тем, что два различных ключевых слова создают практическиидентичныеобъявления.Таксложилосьисторически.ЯзыкC++строилсякакрасширениеС.Вязыке С были структуры, но эти структуры не имели методов класса.
Создатель C++, БьернСтрауструп,опиралсянаструктуры,нозаменилимятипаданныхstructтипомclass,чтобытемсамымзаявитьоновыхрасширенныхфункциональныхвозможностяхэтогоновогообразования.Рекомендуется:Используйте спецификатор const везде, где это возможно. Убедитесь,чтовамполностьюпонятныклассы,преждечемпереходитькследующемузанятию.Помещайте объявление класса в файл с расширением .hpp, а его выполнение — в файл срасширением.cpp.РезюмеСегоднявынаучилисьсоздаватьновыетипыданных,именуемыеклассами.Выузнали,какопределятьпеременныеэтихновыхтипов,которыеназываютсяобъектами.Класссодержитданные-члены,которыепредставляютсобойпеременныеразличныхтипов,включая другие классы. Кроме того, в состав класса входят функции- члены, известные такжекакметоды.Этифункции-членыиспользуютсядлявыполнениядействийнадданными-членамииобеспеченияиногосервиса.Члены класса — как данные, так и функции — могут быть открытыми и закрытыми.Открытые члены доступны для любой части программы, а закрытые — только для функцийчленовданногокласса.Хорошим стилем программирования считается вынесение интерфейса, или объявлениякласса, в файл заголовка, который обычно имеет расширение .hpp.
Выполнение классазаписываетсявфайлсрасширением.cpp.Для инициализации объектов используются конструкторы класса. Когда эти объектыбольше не нужны, они удаляются с помощью деструкторов, которые используются дляосвобожденияпамяти,выделеннойдляэтихобъектовметодамикласса.ВопросыиответыКакопределяетсяразмеробъектакласса?Размер объекта класса в памяти определяется суммой размеров переменных- членов.Методыклассанезанимаютместовобластипамяти,выделеннойдляобъекта.Некоторые компиляторы так располагают переменные в памяти, что двухбайтовыепеременныевдействительностизанимаютнесколькобольшедвухбайтовпамяти.Прижеланиивыможетеуточнитьэтотмоментвдокументациинасвойкомпилятор,нонаданномэтапеэтиподробности,повсейвероятности,небудутиметьдлявасбольшогозначения.ЕслиобъявитьклассCatсзакрытымчленомitsAge,азатемопределитьдваобъектаклассаCat с именами Frisky и Boots, то может ли объект Boots получить доступ к переменной-членуitsAgeобъектаFrisky?Да.
Закрытые данные доступны для функций-членов класса, и различные экземплярыодного класса могут обращаться к данным друг друга. Иными словами, если Frisky и BootsявляютсяэкземплярамиклассаCat,тофункции-членыобъектаFriskyмогутполучитьдоступкакксвоимданным(даннымобъектаFrisky),такикданнымобъектаBoots.Почемунеследуетделатьвседанные-членыоткрытыми?Объявление данных-членов закрытыми позволяет клиенту класса использовать данные, неволнуясь о том, как они хранятся или вычисляются. Например, если класс Cat имеет методGetAge(),клиентыклассаCatмогутвозвратитьзначениевозрастакошки(объектаклассаCat),незаботясь о том, хранится ли оно в какой-нибудь переменной-члене определенного типа иливычисляетсяпозапросу.Если применение функции const для изменения класса вызывает ошибку компилятора, топочемубыпростонеиспользоватьключевоесловоconstитемсамымгарантированноизбежатьсообщенийобошибках?Есливашафункция-членлогическинедолжнаизменятькласс,тоиспользованиеключевогослова const — прекрасный способ заручиться поддержкой компилятора при отысканиислучайных ошибок, Например, у функции GetAge() нет видимых причин для изменения классаCat,новвыполненииклассаможетприсутствоватьследующаястрока:if(itsAge=100)cout<<"ОгоТебеужестолет\n";Объявление функции GetAge() с использованием ключевого слова const заставило быкомпиляторобнаружитьошибку.ВыведьимеливвидусравнениезначенияпеременнойitsAgeсчислом 100, а вместо этого случайно выполнили операцию присвоения числа 100 переменнойitsAge.
Поскольку это присвоение изменяет класс, а вы (с помощью ключевого слова const)заявили,чтоэтотметоднебудетизменятькласс,компиляторсмогнайтиошибку.Ошибки такого рода, как правило, трудно найти простым просмотром текста программы.Мычастовидимто,чтохотимувидеть.Гораздоопаснее,еслинапервыйвзглядвампокажется,чтопрограммаработаетправильно(дажепослеустановкитакогостранногозначения),нораноилипоздноэтанеприятностьпревратитсявпроблему.СуществуетлирезониспользоватьструктурывпрограммахнаC++?Многие программисты используют ключевое слово struct для классов, которые не имеютфункций.МожнорасцениватьэтокакностальгиюпоустаревшимструктурамязыкаС,которыене могли иметь функций. Лично я считаю это ненужным и даже плохим стилемпрограммирования.Ведьеслисегодняданнойструктурененужныметоды,тонеисключено,чтоонимогутпонадобитьсяейзавтра.Итогдавампридетсялибозаменятьэтоттипклассом,либонарушатьсвоежеправилоиработатьсоструктурой,которая"небрезгует"присутствиемвнейметодов.КоллоквиумВэтомразделепредлагаютсявопросыдлясамоконтроляиукрепленияполученныхзнанийи приводится несколько упражнений, которые помогут закрепить ваши практические навыки.Попытайтесьсамостоятельноответитьнавопросытестаивыполнитьзадания,апотомсверьтеполученные результаты с ответами в приложении Г.
Не приступайте к изучению материаласледующей главы, если для вас остались неясными хотя бы некоторые из предложенных нижевопросов.Контрольныевопросы1.Чтопредставляетсобойоператорпрямогодоступаидлячегоониспользуется?2.Чторезервируетпамять—объявлениеилиопределение?3.Объявлениеклассаявляетсяегоинтерфейсомиливыполнением?4.Каковаразницамеждуоткрытыми(public)изакрытыми(private)данными-членами?5.Могутлифункции-членыбытьзакрытыми?6.Могутлипеременные-членыбытьоткрытыми?7. Если объявить два объекта класса Cat, могут ли они иметь различные значения ихпеременных-членовitsAge?8.Нужнолиобъявленияклассазавершатьточкойсзапятой?Аопределенияметодовкласса?9. Как бы выглядел заголовок функции-члена Meow класса Cat, которая не принимаетникакихпараметровивозвращаетзначениетипаvoid?10.Какаяфункциявызываетсядлявыполненияинициализациикласса?Упражнения1.Напишитепрограмму,котораяобъявляеткласссименемEmployee(Служащие)стакимипеременными-членами:age(возраст),yearsOfService(стажработы)иSalary(зарплата).2.
Перепишите класс Employee, чтобы сделать данные-члены закрытыми и обеспечитьоткрытыеметодыдоступадлячтенияиустановкивсехданных-членов.3. Напишите программу с использованием класса Employee, которая создает два объектакласса Employee; устанавливает данные-члены age, YearsOfService и Salary, а затем выводит ихзначения.4. На основе программы из упражнения 3 создайте метод класса Employee, которыйсообщает,сколькотысячдолларовзарабатываетслужащий,округляяответдо1000долларов.5. Измените класс Employee так, чтобы можно было инициализировать данные-члены age,YearsOfServiceиSalaryвпроцессе"создания"служащего.6.Жучки:чтонеправильновследующемобъявлении?classSquare{public:intSide;}7.Жучки:чтовесьмаполезноеотсутствуетвследующемобъявлениикласса?classCat{intGetAge()const;private:intitsAge;};8.Жучки:какиетриошибкиобнаружиткомпиляторвэтомкоде?classTV{public:voidSetStation(intStation);intGetStation()const;private:intitsStation;};main(){TVmyTV;myTV.itsStation=9;TV.SetStation(10);TVmyOtherTv(2);}День7-й.ЦиклыСтруктура любой программы состоит из комбинации множества ветвлений и циклов.
Начетвертомзанятиивынаучилисьорганизовыватьветвлениепрограммыспомощьюоператораif.Сегоднявыузнаете:•Чтотакоециклыикаконииспользуются•Каковыметодыорганизациициклов•Какизбежатьчрезмернойвложенностиконструкцийif/elseОрганизацияцикловДлярешениярядазадаччастотребуетсямногократноевыполнениеоднихитехжедействий.На практике это реализуется с помощью рекурсивных (см. занятие 5) или итеративныхалгоритмов. Суть итеративного процесса заключается в повторении последовательностиоперацийнужноеколичествораз.ИсторияоператораgotoВ те годы, когда программирование находилось еще на начальной стадии развития,использовались только небольшие по размеру и достаточно примитивные программы.