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

Int p; // порядок - инициализация по умолчанию

// Метод - приращение мантиссы:

public void incrementM()

{

m += 1;

if (m >= 10)

{

m /= 10;

p++;

}

}

// Метод для вывода значения числа (объекта):

public void display(string name)

{

string form = name + "\t = {0,8:F5}*10^{1,-3:D2}";

Console.WriteLine(form, m, p);

}

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

public Real(double mi, int pi)

{

m = mi;

p = pi;

reduce();

}

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

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 < 0) {sign = -1; m = -m; }

for (; 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 и порядка p создаваемого

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

них необходимо соблюдение условия:

1.0 <= m < 10.0.

Так как значение аргумента mi при обращении к конструктору может не

удовлетворять этому условию, то в теле конструктора вызывается закрытый для

внешних обращений метод void reduce(). Его задача – нужным образом

преобразовать значения полей m и p.

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

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

Это частный случай конструктора общего вида с одним параметром. В нашем

примере он формирует объект класса Real по одному значению типа double,

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

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

инициализатор, содержащий обращение this(mi, 0) к конструктору с заголовком

Real(double mi, int pi). Значение второго аргумента, определяющего значение поля

int p, задано нулевой константой, что соответствует естественному для математики

способу записи вещественного числа.

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

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

Позволяет создать копию объекта. Ещё раз обратим внимание на его отличие

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

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

несколько переменных (ссылок). Тело конструктора копирования в нашем примере

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

используется инициализатор конструктора, содержащий обращение this(re.m, re.p) к

конструктору общего вида. Вместо инициализатора можно было бы присваивать

значения переменным m и p в теле конструктора. (Конструктор копирования по

умолчанию не создается.)

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

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

параметров:

public Real() { }

Отсутствие параметров, отсутствие (в данном примере) инициализатора

конструктора и пустое тело конструктора вызывает вопрос. А зачем нужен такой

конструктор? Ведь в предыдущем варианте класса Real объявления такого

конструктора не было.

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

не встраивает в определение класса конструктор с пустым списком параметров. При

необходимости такой конструктор нужно объявлять явно, что и сделано.

Конструктор умолчания выполняет инициализацию полей класса в соответствии с

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

е

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

значения.

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

static void Main()

{

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

number.display("number");

Real number1 = new Real(0.000321);// констр. приведения типов

number1.display("number1");

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

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

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

number.display("number");

number1.display("number1");

numCopy.display("numCopy"); // копия сохранила значение

Real numb = new Real(); // конструктор умолчания

numb.display("numb");

}

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

number = 3,03000 * 10^03

number1 = 3,21000 * 10^-04

number = 4,03000 * 10^03

number1 = 4,03000 * 10^03

numCopy = 3,03000 * 10^03

numb = 8,00000 * 10^00

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