Помощь в написании студенческих работ
Антистрессовый сервис

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

РефератПомощь в написанииУзнать стоимостьмоей работы

При отсутствии в объявлении класса каких бы то ни было конструкторов, компилятор встраивает в класс открытый конструктор без параметров. При его использовании начальные значения полей создаваемого объекта определяются либо присутствующими инициализаторами полей, либо по умолчанию. Если автор класса желает по-особому инициализировать поля объектов, либо в классе наряду с другими конструкторами… Читать ещё >

Конструкторы объектов класса (реферат, курсовая, диплом, контрольная)

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

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

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

модификаторы_конструктораор1 имя_конструкпюра (спецификация_параметровор1) инициализатор_конструктораор± тело_конструктора

Имя конструктора — имя именно того класса, которому конструктор принадлежит, других имен у конструктора не может быть.

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

В качестве модификаторов конструктора используются public, protected, internal, private, extern.

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

Спецификация параметров конструктора может отсутствовать в круглых скобках после его имени. В этом случае мы получаем конструктор без параметров.

Тело конструктора это: либо блок — последовательность операторов, заключенная в фигурные скобки; либо пустой оператор, обозначаемый только отдельным символом точка с запятой. Пустой оператор в качестве тела используется только для конструкторов с модификатором extern. Мы будем в качестве тела конструктора использовать блок.

Назначение операторов тела конструктора — выполнить инициализацию создаваемого объекта класса.

Инициализатор_конструктора — это специальное выражение, позволяющее до выполнения операторов тела конструктора обратиться к конструктору базового класса или к другому конструктору этого же класса. Для обращения к конструктору базового класса используется выражение:

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

Здесь base — служебное слово; необязательный список аргументов — список выражений, соответствующих параметрам вызываемого конструктора базового класса.

Инициализатор конструктора, выполняющий обращение к другому конструктору своего же класса, выглядит так:

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

Здесь this — служебное слово; необязательный список аргументов — список выражений, соответствующих параметрам другого конструктора.

Хотя язык C# с помощью механизма сбора мусора (garbage collection) в достаточной мере защищен от таких проблем как «утечка памяти» и «висячие ссылки», однако в C# остается, например, задача глубокого копирования и важным вопросом в ряде случаев является приведение типов, введенных пользовательскими классами. Зачастую для квалифицированного решения названных проблем можно пользоваться конструкторами разных видов. В классе могут быть явно объявлены:

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

При отсутствии в объявлении класса каких бы то ни было конструкторов, компилятор встраивает в класс открытый конструктор без параметров. При его использовании начальные значения полей создаваемого объекта определяются либо присутствующими инициализаторами полей, либо по умолчанию. Если автор класса желает по-особому инициализировать поля объектов, либо в классе наряду с другими конструкторами конструктор умолчания просто необходим — его требуется явно включать в объявления класса. Формат объявления конструктора без параметров:

class CLASS.

{

public CLASSQ.

{

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

>

}

Роль конструктора умолчания может играть не только конструктор без параметров, но и конструктор, все параметры которого снабжены умалчиваемыми значениями аргументов (см. параграф 9.3).

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

// ll06.cs — конструкторы умолчания и копирования using System; class CL {.

public int dom = 6; // поле объекта public int[] an; // поле объекта public CL ().

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

an = new int[] { 1, 2, 3 };

}

public CL (CL ob).

{ // конструктор копирования

dom = ob. dom;

an = (int[])ob.ar.Clone ();

} }

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); two. ar[0] *= 10;

Console.WriteLine («one.ar[0]=» + one. ar[0].

+ «, two. ar[0]=» + two. ar[0]);

} }

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

one.dom=6, two. dom=30 one. ar[0]=l, two. ar[0]=10.

В классе CL конструктор без параметров объявлен явно. В классе CL два открытых поля — переменная int dom и ссылка на массив int [] аг. То есть, каждый объект класса включает в качестве данных целочисленную переменную и одномерный массив.

В методе Main () ссылка one связана с объектом, инициализированным конструктором без параметров. Объект, адресуемый ссылкой two, — копия объекта one, но эти объекты независимы, что иллюстрируют результаты выполнения программы. Названная независимость объектов обеспечена конструктором копирования. В нем поля нового создаваемого объекта получают значения, копируемые из объектапараметра. Для целочисленного поля int dom копирование выполняется с помощью присваивания. Копирование массива, ассоциированного с полем int [] аг (ссылка с типом массива), требует не присваивания, а глубокого копирования. Для этого используются возможности «библиотечного» нестатического метода Clone ():

аг = (int[])ob.ar.Clone ();

Метод вызывается для того массива, который представлен ссылочным полем объекта-параметра (ob.ar) конструктора копирования. Так как метод Clone () возвращает значение типа object, то для присваивания результата переменной выполнено явное приведение типов.

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

Особенности обращений конструкторов одного класса друг к другу рассмотрим на промере класса, особым образом представляющего вещественные числа. В научной записи (в научной нотации) число записывается в виде произведения двух чисел: целой степени р числа 10 и числа ш, удовлетворяющего условию 1.0 < = m < 10.0. Иногда р называют показателем, а ш — мантиссой числа. Таким образом, запись каждого числа выглядит так: ш*10р (при выводе значения числа возведение в степень будем обозначать символом 'ч).

Примеры:

  • — постоянная Авогадро: 6.2 486 * 1023 (г*моль)-1,
  • — заряд электрона: -4.80 286 * 10-10 (СГСЭ).

Определим класс Real для представления чисел в научной нотации. В классе определим метод displayO для вывода на консоль значения объекта и метод incrementMO для увеличения на 1 значения мантиссы числа. При этом значение числа увеличивается, конечно, не на 1, а на Юр. Для мантисс и показателей введем закрытые поля double m и int р. Определение класса может быть таким (программа ll07.cs):

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

class Real.

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

double m = 8.0; // мантисса — явная инициализация int р; // порядок — инициализация по умолчанию // Метод — приращение мантиссы: public void incrementM ().

{

m += 1;

if (m >= 10) { m /= 10; p++; }.

// Метод для вывода значения числа (объекта): public void display (string name).

{

string form = name + «= {0,8:F5}*10A{1, -3:D2}» ;

Console.WriteLine (form, m, p);

}

// Конструктор общего вида: public Real (double mi, int pi).

{

m = mi;

P = pi; reduceQ;

}

// Конструктор приведения типов: public Real (double mi): this (mi, 0).

{ }

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

public Real (Real re): this (re.m, re. p).

{ >

// Конструктор умолчания: public Real () { }.

// " Внутренний" для класса метод: void reduce ().

{ // Приведение числа к каноническому виду double sign = 1;

if (m = 10; m /= 10, p += 1); for (; m < 1; m *= 10, p -= 1); m *= sign;

}

Среди методов класса нам сейчас важно рассмотреть явно определенные в классе конструкторы.

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

public Real (double mi, int pi).

{

m = mi;

P = pi; reduce ();

}

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

1.0 <= m < 10.0.

Так как значение аргумента mi при обращении к конструктору может не удовлетворять этому условию, то в теле конструктора вызывается закрытый для внешних обращений метод void reduce(). Его задача — нужным образом преобразовать значения полей тир. Конструктор приведения типов:

public Real (double mi): this (mi, 0) {}.

Это частный случай конструктора общего вида с одним параметром. В нашем примере он формирует объект класса Real по одному значению типа double, использованному в качестве аргумента. Тем самым этот конструктор позволяет преобразовать числовое значение в объект класса Real. В конструкторе применен инициализатор, содержащий обращение this (mi, 0) к конструктору с заголовком Real (double mi, int pi). Значение второго аргумента, определяющего значение поля int р, задано нулевой константой, что соответствует естественному для математики способу записи вещественного числа.

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

public Real (Real re): this (re.m, re. p) {}.

позволяет создать копию объекта. Еще раз обратим внимание на его отличие от операции присваивания, применение которой копирует только значение ссылки на объект. После присваивания ссылок на один объект начинают указывать несколько переменных (ссылок). Тело конструктора копирования в нашем примере не содержит операторов. Для присваивания значений полям создаваемого объекта используется инициализатор конструктора, содержащий обращение this (re.m, re. p) к конструктору общего вида. Вместо инициализатора можно было бы присваивать значения переменным m и р в теле конструктора (конструктор копирования по умолчанию не создается).

Конструктор умолчания, т. е. конструктор без параметров:

public Real () {}.

При наличии явно определенных конструкторов (хотя бы одного) компилятор не встраивает в определение класса конструктор с пустым списком параметров. В тех случаях, когда конструктор умолчания нужен, он декларируется явным образом, что и сделано в классе Real.

Пример применения конструкторов класса (программа ll07.cs):

static void Main ().

{

Real number = new Real (303.0, 1);// констр. общего вида number. display («number»);

Real numberl = new Real (0.321);// констр. приведения numberl. display («numberl»);

Real numCopy = new Real (number); // конструктор копирования

numberl = number; // присваивание ссылок

number.incrementM (); // изменение объекта

number.display («number»);

numberl.display («numberl»);

numCopy.display («numCopy»); 11 копия сохранила значение Real numb = new Real (); // конструктор умолчания numb. display («numb»);

number = 3,3 000*10А03 numberl = 3,21 000*10л-04 number = 4,3 000*10л03 numberl = 4,3 000*10А03 numCopy = 3,3 000*10А03 numb = 8,0*10A00.

Показать весь текст
Заполнить форму текущей работой