Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 33
Текст из файла (страница 33)
Кроме того, доступ обычно представляет собой модификатор доступа типа риЫ1с, поскольку конструкторы зачастую вызываются в классе. А список параметров может быть как пустым, так и состоящим из одного или более указываемых параметров. У всех классов имеются конструкторы, независимо от того, определите вы их или нет, поскольку в СК) автоматически предоставляется конструктор, используемый по умолчанию и инициализирующий все переменные экземпляра их значениями по умолчанию. Для большинства типов данных значением по умолчанию является нулевое, для типа Ьоо1 — значение ка1ве, а для ссылочных типов — пустое значение.
Но как только вы определите свой собственный конструктор, то конструктор по умолчанию больше не используется. Ниже приведен простой пример применения конструктора. // Простой конструктор. ивьпч Бувкепы с1авя МуС1авя ( риЫ1с 1пк хт риЫьс МуС1авв() ( х = 10т ) ) с1яяя Сопяпемо ( всяк1с совы Мя1п() ( ИуС1авя С1 = пен МУС1яяв(); иус1аяя с2 = пен муС1яяя()т Сопяо1е.ыгьке11пе(С1.х + " " + С2.х); ) В данном примере конструктор класса мус1авв имеет следующий вид: риЫкс МуС1авя () ( х = 10; Обратите внимание на то, что этот конструктор обозначается как ри)в11с.
Дело в том, что он должен вызываться из кода, определенного за пределами его класса. В этом конструкторе переменной экземпляра класса иуС1аяя присваивается значение 10. Он вызывается в операторе пен при создании объекта. Например, в следующей строке: МУС1аяя С1 пен МуС1аяя() конструктор ИуС1азз() вызывается для объекта 01, присваивая переменной его экземпляра 01. х значение 10. То же самое происходит и для объекта 02. После конструирования переменная с2.
х будет содержать то же самое значение 10. Таким образом, выполнение приведенного выше кода приведет к следующему результату: 10 10 164 Часть ). Язык Са Параметризованные конструкторы В предыдущем примере использовался конструктор без параметров. В некоторых случаях этого оказывается достаточно, но зачастую конструктор должен принимать один или более параметров., В конструктор параметры вводятся таким же образом, как и в метод.
Для этого достаточно объявить их в скобках после имени конструктора. Ниже приведен пример применения параметризированного конструктора муС1азз. // Параиетриэированный конструктор. цз1пд Бузсеап с1азз МуС1азз ( рцЫьс 1пк рцЫъс МуС1азз(ьпк 1) ( х=).т ) ) с1азз РагщСопвпещо ( зоакъс ноти Ма1п() ( МуС1азз С1 = пен МуС1азв(10) МуС1азз С2 = пен МуС1азв(88) Сопво1е.игъкеъ1пе(С1.х + " " ь С2.х) ) ) При выполнении этого кода получается следующий результат: 10 88 В данном варианте конструктора Мус1азз () определен параметр 1, с помощью которого инициализируется переменная экземпляра х.
Поэтому при выполнении следующей строки кода: МуС1азз 11 = пен Мус1азз(10)т параметру 1 передается значение, которое затем присваивается переменной х. Добавление конструктора в класс Вих1с1~пд Класс Вц11б1пд можно еще больше усовершенствовать, добавив в него конструктор, автоматически инициализирующий поля Г1оогз, йгеа и сссцрапсз при создании объекта. Обратите особое внимание на то, как создаются объекты класса Вц11с(ъпд. // Добавить конструктор в класс ВЫ161пч. цзьпд зузкетщ с1азз Вц1101пп ( рцЬ11с 1пк Р1оогз; // количество этажей рцЫъс 1пк Агеа/ // общая площадь здания рцЫ1с 1пк Оссцрапкз; // количество жильцов Глава 6.
Введение в классы, объекты н методы 165 // Параметризированный конструктор // для класса ВЫ1агпд. риЫ1с Ви1161пд(1пс Е, 1пс а, гпс о) ( Р1оогя = Е; Агеа а; Оссирапся от ) // Возвратить площадь на одного человека. риЫ1с 1пс АгеаРегРегяоп() ( гетигп Агеа / Оссирапся; О Возвратить максимальное количество человек, // занимающих здание, исходя из заданной минимальной // площади на одного человека. риЫгс гпс Махоссирапс(ъпс щгпАгеа) ( гесигп Агеа / югпАгеат ) // Использовать параметризированный конструктор О класса Ви114)1пд.
с1аяя Ви11т)1пдоещо ( всасгс чоъа маьп() ( ВЫ1агпд Почве = пен ВЫ101пд(2, 2500, 4) т Ви11сгпд оЕЕ1се = пеи Ви11агпд(3, 4200, 25)т Сопяо1е.нг1сеьъпе( "Максимальное количество человек в доме, тп" + "если на каждого должно приходиться " ь 300 + " кв. футов: лоияе .махоссирапг (300) ) т Сопяо1е.нгтсеьтпе( "Максимальное количество человек " + "в учреждении, 1п" + "если на каждого должно приходиться " + 300 + " кв.
футов: оЕЕгсе.Махоссирапс(300))т Результат выполнения этой программы оказывается таким же, как и в предыдущей ее версии. Оба объекта, )тоияе и ОЕЕгсе, были инициализированы конструктором ви11с(1пд () при их создании в соответствии с параметрами, указанными в этом конструкторе. Например, в строке ВЫ161пд Почве пен Ви11т)1пд(2, 2500, 4)т конструктору Виг101пд() передаются значения 2, 2500 и 4 при создании нового объекта. Следовательно, в копиях переменных экземпляра Р1оогя, Агеа и Оссирапгя объекта )тоияе сохранятся значения 2, 2500 и 4 соответственно. 166 Часть (, Язык С№ Еще раз об операторе петт Теперь, когда вы ближе ознакомились с классами и их конструкторами, вернемся к оператору лен, чтобы рассмотреть его более подробно.
В отношении классов общая форма оператора пен такова: пен имя класса (список аргументов) где имя класса обозначает имя класса, реализуемого в виде экземпляра его объекта. А имя класса с последующими скобками обозначает конструктор этого класса. Если в классе не определен его собственный конструктор, то в операторе пен будет использован конструктор, предоставляемый в С№ по умолчанию. Следовательно, оператор леы может быть использован для создания объекта, относящегося к'классу любого типа. Оперативная память не бесконечна, и поэтому вполне возможно, что оператору пеы не удастся распределить память для объекта из-за нехватки имеющейся памяти.
В этом случае возникает исключительная ситуация во время выполнения (подробнее об обработке исключительных ситуаций речь пойдет в главе 13). В примерах программ, приведенных в этой книге, ситуация, связанная с исчерпанием оперативной памяти, не учитывается, но при написании реальных программ такую возможность, вероятно, придется принимать во внимание. Применение оператора пет№ вместе с типами значений В связи с изложенным выше возникает резонный вопрос: почему оператор пеы нецелесообразно применять к переменным таких типов значений, как 1пс или 11оас? В С№ переменная типа значения содержит свое собственное значение. Память для хранения этого значения выделяется автоматически во время прогона программы.
Следовательно, распределять память явным образом с помощью оператора пеы нет никакой необходимости. С другой стороны, в переменной ссылочного типа хранится ссылка на объект, и поэтому память для хранения этого объекта должна распределяться динамически во время выполнения программы. Благодаря тому что основные типы данных, например 1лг или сваг, не преобразуются в ссылочные типы, существенно повышается производительность программы. Ведь при использовании ссылочного типа существует уровень косвенности, повышающий издержки на доступ к каждому объекту.
Такой уровень косвенности исключается при использовании типа значения. Но ради интереса следует все же отметить, что оператор пен разрешается использовать вместе с типами значений, как показывает следующий пример: 1пс 1 = пен 1пс()т При этом для типа 1пС вызывается конструктор по умолчанию, инициализирующий переменную 1 нулевым значением. В качестве примера рассмотрим такую программу: // Использовать оператор лен вместе с типом значения. цв1пд Зузсегм с1азз пенча1це ( зтаоьс чо1с( Ма1п() ( ьпС 1 = пен ьпС(); // инициализировать переменную // 1 нулевым значением Глава б.
Введение в классы, обьекты и методы 167 Сопао1а.ыг1кеьгпе("Значение переменной 1 равно: " а 1) ) ) Выполнение этой программы дает следующий результат: Значение переменной 1 равно: О Как показывает результат выполнения данной программы, переменная 1 инициализируется нулевым значением. Напомним, что если не применить оператор пен, то переменная 1 окажется неинициализированной. Это может привести к ошибке при попытке воспользоваться ею в операторе, содержащем вызов метода Ыгйкепйпе (), если предварительно не задать ее значение явным образом. В общем, обращение к оператору пен для любого типа значения приводит к вызову конструктора, используемого по умолчанию для данного типа.