Программирование >>  Дополнительные возможности наследования 

1 ... 45 46 47 [ 48 ] 49 50 51 ... 265


раметра, передаваемые конструктору, копируются в соответствующие четыре пере-менные-члена (см. листинг 6.9), после чего устанавливаются четыре точки (четыре объекта класса Point).

Помимо обычных функций доступа к данным-членам класса, в классе Rectangle предусмотрена функция GetAreaO, объявленная в строке 43. Вместо хранения значения площади в виде переменной эта функция вычисляет площадь в строках 28 и 29 листинга 6.9. Для этого сначала вычисляются значения длины и щирины прямоугольника, а затем полученные результаты перемножаются.

Для получения координаты верхнего левого угла прямоугольника нужно получить доступ к точке UpperLeft и запросить ее значение X. Поскольку функция GetUpperLeftO является методом класса Rectangle, она может непосредственно получить доступ к закрытым данным этого класса, включая и доступ к переменной itsUpperLeft. Поскольку переменная itsUpperLeft является объектом класса Point, а переменная itsX этого объекта закрытая, функция GetUpperLeftO не может прямо обратиться к этой переменной. Вместо этого для получения значения переменной itsX она должна использовать открытую функцию доступа GetX().

В строке 33 листинга 6.9 начинается тело основной части программы. До выполнения строки 36 никакой памяти не вьщелялось и ничего, по сути, не происходило. Все, сделанное до сих пор, служило одной цели - сообщить компилятору, как создается точка и как создается прямоугольник (на случай, если в этом появится необходимость).

В строке 36 определяется прямоугольник (объект класса Rectangle) путем передачи реальных значений для параметров Тор, Left, Bottom и Right.

В строке 37 создается локальная переменная Area типа int. Она предназначена для хранения площади созданного прямоугольника. Переменной Area присваивается значение, возвращаемое функцией-членом GetAreaO класса Rectangle.

Клиент класса Rectangle может создать объект Rectangle и возвратить его площадь, не заботясь о нюансах выполнения функции GetAreaO.

В листинге 6.8 показано содержимое заголовочного файла Rect.hpp. Только лишь просмотрев заголовочный файл, который содержит объявление класса Rectangle, программист будет знать, что функция GetAreaO возвращает значение типа int. Пользователя класса Rectangle не волнуют производственные секреты функции GetAreaO. И в самом деле, автор класса Rectangle мог бы спокойно изменить выполнение функции GetAreaO, и это бы не повлияло на программы, использующие класс Rectangle.

Вопросы о ответы

Каково различие между объявлением и определением?

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

Структуры

Очень близким родственником ключевого слова class является ключевое слово struct, которое используется для объявления структуры. В языке С++ структура - это тот же класс, но с открытыми по умолчанию членами. Структуру можно объявить подобно тому, как объявляется класс, наделив ее такими же переменными-членами и



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

Попытаемся повторно ввести содержимое листинга 6.8 с учетом следующих изменений:

в строке 3 заменим объявление class Point объявлением struct Point;

в строке 17 заменим объявление class Rectangle объявлением struct Rectangle.

Теперь вновь запустим нашу программу и сравним результаты. При этом никакой разницы вы заметить не должны.

Почему yea ключевых слова несут оуонаковую смысловую нагрузку

Вы, вероятно, удивлены тем, что два различных ключевых слова создают практически идентичные объявления. Так сложилось исторически. Язык С++ строился как расширение С. В языке С были структуры, но эти структуры не имели методов класса. Создатель С++, Бьерн Строустрап, опирался на структуры, но заменил имя типа данных struct типом class, чтобы тем самым заявить о новых расширенных функциональных возможностях этого нового образования.

Рекомендуется

Помещайте объявление класса в файл с расширением .hpp, а его выполнение - в файл с расширением срр-.

Рвкоменддвтся

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

Резюме

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

Класс содержит данные-члены, которые представляют собой переменные различных типов, включая другие классы. Кроме того, в состав класса входят функции-члены, известные также как методы. Эти функции-члены используются для вьшолнения действий над данными-членами и обеспечения иного сервиса.

Члены класса - как данные, так и функции - могут быть открытыми и закрытыми. Открытые члены доступны для любой части программы, а закрытые - только для функций-членов данного класса.

Хорошим стилем программирования считается вынесение интерфейса, или объявления класса, в файл заголовка, который обычно имеет расширение hpp. Выполнение класса записывается в файл с расширением .срр.

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



Вопросы u ответы

Как определяется размер объекта класса?

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

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

Если объявить класс Cat с закрытым членом itsAge, а затем определить два объекта класса Cat с именами Friscky и Boots, то может ли объект Boots получить доступ к переменной-члену itsAge объекта Friscky?

Да. Закрытые данные доступны для функций-членов класса, и различные экземпляры одного класса могут обращаться к данным друг друга. Иными словами, если Friscky и Boots являются экземплярами класса Cat, то функции-члены объекта Friscky могут получить доступ как к своим данным (данным объекта Friscky), так и к данным объекта Boots.

Почему не следует делать все данные-члены открытыми?

Объявление данных-членов закрытыми позволяет клиенту класса использовать данные, не волнуясь о том, как они хранятся или вычисляются. Например, если класс Cat имеет метод GetAgeO, клиенты класса Cat могут возвратить значение возраста кошки (объекта класса Cat), не заботясь о том, хранится ли оно в какой-нибудь переменной-члене определенного типа или вычисляется по запросу.

Если применение функции const для изменения класса вызывает ошибку компилятора, то почему бы просто не использовать ключевое слово const и тем самым гарантированно избежать сообщений об ошибках?

Если ваша функция-член логически не должна изменять класс, то использование ключевого слова const - прекрасный способ заручиться поддержкой компилятора при отыскании случайных ошибок. Например, у функции GetAgeO нет видимых причин для изменения класса Cat, но в вы1юлнении класса может присутствовать следующая строка:

if (itsAgn = 100) colli < Oio! Тпбо ужо сто лоДп ;

Объявление функции GoiAyeO с использованием ключевого слова const заставило бы компилятор обнаружить ошибку. Вы ведь имели в виду сравнение значения переменной itsAge с числом 100, а вместо этого случайно выполнили операцию присвоения числа 100 переменной itsAyn. Поскольку это присвоение изменяет класс, а вы (с помощью ключевого слова consi) заявили, что этот метод не будет изменять класс, компилятор смог найти ошибку.

Ошибки такого рода, как правило, трудно найти простым просмотром текста профаммы. Мы часто видим то, что хотим увидеть. Гораздо опаснее, если на первый взгляд вам покажется, что программа работает правильно (даже после установки такого странного значения), но рано или поздно эта неприятность превратится в проблему.

Существует ли резон использовать структуры в профаммах на С++?

Многие программисты используют ключевое слово struct для классов, которые не имеют функций. Можно расценивать это как ностальгию по устаревшим структурам языка С, которые не могли иметь функций. Лично я считаю это ненужным и даже плохим стилем программирования. Ведь если сегодня данной структуре не нужны ме-



1 ... 45 46 47 [ 48 ] 49 50 51 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика