Cтраница 3
Если я объявляю объект класса, хранящийся в стеке, а этот объект, в свою очередь, имеет переменные-члены, хранящиеся в области динамического обмена, то какие части объекта будут находиться в стеке, а какие - в области динамического обмена. [31]
Переменные-члены, известные также как данные-члены, принадлежат только своему классу. Переменные-члены - это такие же составные части класса, как колеса и мотор - составные части автомобиля. [32]
Функции, определенные внутри класса, называются функциями-членами или методами класса. В этом примере переменные-члены - Left, Top, Right и Bottom, а функция-член - Draw. Обратите внимание: функция-член может содержать ссылку на любую переменную класса, не используя при этом специальный синтаксис. [33]
В этом случае переменные-члены могут быть определены следующим образом. [34]
Конструктор без параметров называют конструктором по умолчанию. Такой конструктор обычно инициализирует переменные-члены, присваивая им стандартные, установленные по умолчанию значения. [35]
Выражение: public CRectangle обозначает класс CBlock как производный от CRectangle. Класс CBlock наследует все переменные-члены и функции CRectangle. Другими словами, несмотря на то, что определение класса CBlock является пустым, он уже содержит функции GetCoord, SetCoord и Draw, а также переменные Left, Top, Right и Bottom, определенные в классе CRectangle. При этом CRectangle называют базовым, а класс CBlock - производным классами. [36]
В Delphi конструктор инициализирует переменные-члены, переводя тем самым экземпляр объекта в заведомо корректное состояние. Однако конструктор не выполняет каких-либо выделений памяти. Поэтому часто приходится видеть, что конструктор выполняет все необходимые присвоения, а затем обращается к конструктору базового класса. В некоторых случаях вы можете вообще не обращаться к конструктору базового класса, и эта ситуация является вполне допустимой. NET такой подход является неприемлемым. В вашем собственном конструкторе вы обязаны обратиться к конструктору базового класса ( inherited Create), причем обращение к этому конструктору должно быть самым первым исполняемым выражением вашего конструктора. В настоящее время, если вы не обеспечиваете подобного обращения, компилятор выдает сообщение об ошибке, в котором указывается, что ссылка Self не инициализирована и что перед обращением к любым полям предка необходимо обратиться к конструктору базового класса. [37]
Иерархическая структура нашего мира берет свое начало неизвестно откуда, но наша конкретная программа начинается с класса Mammal. В связи с этим некоторые переменные-члены, которые необходимы для работы базового класса, должны быть представлены в объявлении этого класса. Например, все животные независимо от вида и породы имеют возраст и вес. [38]
Класс - это нечто похожее на структуру в языке С. Однако он может содержать и переменные-члены ( или поля), и функции ( известные как функции-члены или методы класса), которые оперируют переменными-членами. [39]
Источник проблемы заключается в аргументах функции. Аргументы х и у скроют закрытые переменные-члены х и у, объявленные в классе Рапе, поэтому вместо присвоения значений аргументов переменным-членам произойдет присвоение этих значений самим себе. [40]
Инициализация переменных внутри определения класса бессмысленна, потому что определение класса задает всего лишь тип каждой из переменных-членов, но не резервирует для них реальную область памяти. Скорее всего, при написании программы требуется инициализировать переменные-члены каждый раз при описании экземпляра класса. Следовательно, целесообразно инициализировать переменные внутри конструктора класса. Конструктор класса CRectangle инициализирует переменные-члены, используя выражение присваивания. Однако определенным типам данных, в частности, константам и ссылкам, не могут быть присвоены значения. Чтобы эта проблема не возникала, в языке C предусмотрено специальное свойство конструктора, называемое списком инициализации, который позволяет инициализировать одну или более переменных, а не присваивать им значения. [41]
Большинство переменных может быть задано на любом из этих этапов: как во время инициализации, так и во время выполнения конструктора. Но логически правильнее, а зачастую и эффективнее, инициализировать переменные-члены во время инициализации конструктора. [42]
Поскольку обычная функция-член может изменить значение одной или нескольких переменных-членов, компилятор не позволяет вызвать функцию-член объекта типа const. Компилятор не имеет возможности проверить, модифицирует ли в действительности метод класса переменные-члены, так как реализация функции может находиться в отдельном файле исходного кода. [43]
Как и модальное диалоговое окно, немодальное создают, используя редактор диалоговых окон Developer Studio. Чтобы породить класс для управления немодальным диалоговым окном от класса CDialog и определить переменные-члены и обработчики сообщений, используют мастер ClassWizard, как и для модального диалогового окна. [44]
Копировщик, заданный компилятором по умолчанию, просто копирует все переменные-члены из указанного в параметре объекта в переменные-члены нового объекта. Такое копирование называется поверхностным; и, хотя оно подходит для большинства случаев, могут возникнуть серьезные проблемы, если переменные-члены окажутся указателями на ячейки динамической памяти. [45]