Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky.rtf
Скачиваний:
27
Добавлен:
22.03.2016
Размер:
11.9 Mб
Скачать

11.6. Конструкторы объектов класса

Недостаток

рассмотренных

выше

класса

counter

и

класса

Link

невозможность определять объекты, начальные значения полей которых задаются

вне объявления класса. Конструктор умолчания умеет создавать только объекты со

значениями полей, определенными инициализацией. При создании любого объекта

класса Real поле m равно 8.0 и поле p равно 0. Нужные программисту начальные

значения полей создаваемого объекта можно определять с помощью явно

объявленного в классе конструктора.

Конструктор объектов

"конструктор:конструктор объектов"

(иначе

экземпляров) класса – это метод класса, в котором реализованы все действия,

необходимые для инициализации объекта класса при его создании. Для простоты

выражение "конструктор объектов (иначе экземпляров) класса" обычно сокращают

и говорят просто о конструкторе. (Обратите внимание, что этот термин не

применяют к статическому конструктору.)

Внешне любой конструктор – это метод класса, имя которого всегда совпадает

с именем самого класса. Формат объявления конструктора:

модификаторы_конструктораopt

имя_конструктора

(спецификация_параметровopt)

инициализатор_конструктораopt

тело_конструктора

Имя конструктора "конструктор:имя конструктора" – имя именно того

класса, которому конструктор принадлежит, других имен у конструктора не может

быть.

Обратите внимание, что у конструктора отсутствует тип возвращаемого

значения, даже тип void в качестве типа возвращаемого значения для конструктора

недопустим.

В качестве модификаторов конструктора используются

:

public, protected, internal, private, extern

Первые четыре модификатора — это модификаторы доступа. Их назначение

мы уже рассмотрели. О назначении модификатора extern мы уже упоминали в связи

с методами класса.

Спецификация параметров конструктора может отсутствовать, но если она

есть, то содержит спецификации всех параметров конструктора.

Тело конструктора "конструктор:тело конструктора" это: либо блок

последовательность операторов, заключенная в фигурные скобки; либо пустой

оператор, обозначаемый только отдельным символом точка с запятой. Пустой

оператор в качестве тела используется только для конструкторов с модификатором

extern. Мы будем в качестве тела конструктора использовать блок.

Назначение операторов тела конструктора – выполнить инициализацию

создаваемого объекта класса.

Инициализатор

_

конструктора

"конструктор:инициализатор_конструктора"

– это специальное средство,

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

конструктору базового класса или к другому конструктору этого же класса. Для

обращения к конструктору базового класса используется выражение:

: base (список_аргументовopt)

Здесь base – служебное слово

"служебное слово: base" ; необязательный

список

аргументов

список

выражений,

соответствующих

параметрам

вызываемого конструктора базового класса.

Инициализатор

конструктора ,

выполняющий

обращение

к

другому

конструктору своего же класса, выглядит так:

: this (список_аргументовopt)

Здесь this – служебное слово

"служебное слово: this" ; необязательный

список аргументов – список выражений, соответствующих параметрам другого

конструктора

.

Хотя язык C# с помощью механизма сбора мусора (garbage collection) в

достаточной мере защищён от таких проблем как "утечка памяти" и "висячие

ссылки", однако в C# остаётся, например, задача глубокого копирования и важным

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

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

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

конструктор умолчания

"конструктор: умолчания" (конструктор без

параметров);

конструктор копирования "конструктор: копирования" ;

конструктор приведения типов "конструктор: приведения типов" ;

конструктор общего вида "конструктор: общего вида" .

При отсутствии в объявлении класса каких бы то ни было конструкторов,

компилятор встраивает в класс конструктор умолчания – открытый конструктор

без параметров. Его роль – задать начальные значения полей создаваемого объекта

класса с помощью инициализаторов, присутствующих в объявлениях полей, либо по

умолчанию. Если автор класса желает по особому инициализировать поля объектов,

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

конструкторами, – его требуется явно включать в объявления класса. Формат

объявления:

class CLASS {

public CLASS() {

операторы_тела_конструктораopt

}

}

Конструктор копирования "конструктор: копирования" это конструктор с

одним параметром, тип которого – ссылка на объект своего класса. Такой

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

возможность создать точную копию уже существующего объекта. Присваивание

ссылке с типом класса значения ссылки на существующий объект того же класса

копии объекта не создаёт. Две ссылки начинают адресовать один и тот же объект.

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

т

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

конструктором копирования.

// 11_06.cs конструкторы

using System;

class CL{

public int dom = 6;

public CL() { } // конструктор умолчания

public CL(CL ob) { // конструктор копирования

dom = ob.dom;

}

}

class Program {

static void Main() {

CL one = new CL();

CL two = new CL(one);

two.dom = 5*one.dom;

Console.WriteLine("one.dom="+one.dom+", two.dom="+two.dom);

}

}

Результат выполнения программы:

one.dom=6, two.dom=30

В классе CL конструктор без параметров объявлен явно. Для простоты

примера в классе CL всего одно открытое поле int dom. В методе Main() ссылка one

связана с объектом, инициализированным конструктором без параметров. Объект,

адресуемый ссылкой two – копия объекта one, но эти объекты независимы, что

иллюстрируют результаты выполнения программы.

Особенности обращений конструкторов одного класса друг к другу расмотрим

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

научной записи (в научной нотации) число записывается в виде произведения двух

чисел: целой степени p числа 10 и числа m, удовлетворяющего условию 1.0 <= m <

10.0. Иногда p называют показателем, а m – мантиссой числа. Таким образом,

запись каждого числа выглядит так: m*10p. (При выводе значения числа в научной

нотации возведение в степень будем обозначать символом ^.).

Примеры: постоянная Авогадро: 6.02486 * 1023 (г*моль)-1,

заряд электрона: -4.80286 * 10-10 СГСЭ.

Определим класс Real для представления чисел в научной нотации. В классе

определим метод display() для вывода на консоль значения объекта и метод

incrementM() для увеличения на 1 значения мантиссы числа. При этом значение

числа увеличивается, конечно, не на 1, а на 10p. Для мантисс и показателей введем

закрытые поля double m и int p. Определение класса может быть таким (программа

11_07.cs):

using System;

class Real // Класс чисел в научной нотации

{ // Закрытые поля:

double m = 8.0; // мантисса - явная инициализация

Соседние файлы в папке CSBasicCourse2ndedPodbelsky