Выбрать главу

name. Аналогично, инструкции this.number и this.category являются, со-

ответственно, ссылками на поля number и category создаваемого объекта.

Разумеется,  не  все  так  просто,  как  кажется  на  первый  взгляд.  Мы

знаем, что обращение к нестатическим полям и методам выполняется

с указанием объекта. Если мы обращаемся к полю при описании про-

граммного кода метода внутри класса, объект как бы отсутствует. Мы

в таких случаях просто писали имя поля или имя метода (с аргумен-

тами или без). Так делать можно — это упрощенная форма ссылки

на поля и методы внутри класса. Но это идеологически не совсем

правильно. Другими словами, объект все равно есть, потому что без

объекта  о  нестатическом  поле  или  методе  говорить  нет  никакого

смысла. Просто в случае внутреннего кода класса под объектом под-

разумевается тот, из которого вызывается метод, или к полю которого

выполняется обращение. Для формальной ссылки на этот объект ис-

пользуют ключевое слово this. Поэтому если в коде метода встречается

инструкция вида this.поле, это означает обращение к полю объекта, из

68

Глава 2. Классы и объекты

которого вызывается метод. Это же касается и вызова методов. Другое

дело, что вместо этой классической формы внутри класса ссылка на

поля и методы выполняется в упрощенной форме.

Выше мы столкнулись с неоднозначностью — и поля класса, и аргу-

менты конструктора имеют совпадающие имена. Аргумент метода или

конструктора во многом соответствует представлению о локальной

переменной — эта переменная известна и доступна только внутри

метода или конструктора. Если имя локальной переменной совпа-

дает с полем класса, приоритет остается за локальной переменной.

Следовательно, если внутри метода (или класса) просто написать имя

переменной, это будет именно локальная переменная (в нашем случае

аргумент). Поэтому по необходимости ссылку на одноименные поля

выполняем с использованием ключевого слова this.

Следует также отметить, что это не единственный способ использова-

ния ключевого слова this. В этом мы убедимся несколько позже.

В коде конструктора есть команда вызова метода show(). Этот метод ото-

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

объекта, из которого вызван метод. Поскольку метод вызывается из кон-

структора, в окне сообщения будут отображены значения полей вновь соз-

данного объекта.

Также у класса есть конструктор с одним текстовым аргументом. Аргумент

конструктора определяет значение поля name. Два других поля получают

значения по умолчанию — у поля number будет значение 10000, а поле catego ry получит значение 'B'. Как и в случае конструктора с тремя аргументами, напоследок в конструкторе с одним аргументом вызывается метод show().

Помимо этих двух конструкторов, у класса есть еще один, достаточно по-

лезный конструктор создания копии. Это общее установившееся название

для конструкторов, которые позволяют создавать новые объекты на основе

уже существующих объектов. При этом новый объект на самом деле совсем

не обязательно должен быть копией исходного объекта (того объекта, что

передается аргументом конструктору). Просто параметры объекта, пере-

данного аргументом конструктору, используются для вычисления значе-

ний полей создаваемого объекта. У конструктора создания копии сигнатура

такая: License(License obj). У этого конструктора один аргумент, который

является объектом класса License. Значения полей создаваемого объекта

формируются на основе полей объекта-аргумента конструктора. Значе-

ние поля name создаваемого объекта получается добавлением к текстово-

му значению поля name объекта-аргумента текстовой фразы " - дубликат".

Поле number создаваемого объекта на единицу больше соответствующего

поля объекта-аргумента конструктора. Значение поля category у обоих

Конструкторы и деструкторы           69

объектов совпадает. Традиционно в конце выполнения всех вычислений

результат отображаем с помощью метода show().

У деструктора класса License сигнатура простая и лаконичная: ~License().

Что касается программного кода деструктора, то сначала командой

string txt="Удаление объекта!\n"+getInfo() инициализируется текстовая

переменная txt со значением, которое получается объединением текстовой