Создание экземпляров класса. Назначение оператора new

Классы разрабатываются пошагово, тестируя конструкторы и каждый метод в Main().Для этого нужно определить ссылочную переменную(экземпляр класса, объект) следующим образом:

Имя_класса Имя_переменной = new Имя_класса(…);

Например:

class Test

{

public static void Main( )

{

MyClass ob1=new MyClass( );

ob1. Show();

MyClass ob2=new MyClass(-13.85, 101.7);

ob2. Show();

}

}

Создание экземпляра класса (объекта) происходит в следующей строке: MyClass ob1=new MyClass();. Здесь выполняется два действия. Во-первых, объявляется переменная ob1 классового типа MyClass. Но эта переменная не определяет объект, а может лишь ссылаться на него. Во-вторых, рассматриваемое объявление создает новый объект и присваивает переменной ob1 ссылку на этот объект. Оператор new динамически (т. е. во время выполнения программы) вычисляет объём памяти для объекта (8байт+8байт) и возвращает ссылку на него. Эта ссылка, сохраненная в конкретной переменной ob1, служит адресом объекта в памяти, выделенной для него оператором new. Такое определение объекта называется ранним связыванием.

Можно создать объект и так:

MyClass ob3; // объявление ссылки на объект.

. . .

ob3= new MyClass(12,0.763); // Выделение памяти для объекта.

После выполнения первой строки переменная ob3 содержит значение null, которое означает, что она не ссылается ни на какой объект. После выполнения второй строки будет создан новый объект. Такое определение объекта в два этапа называется поздним связыванием.

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

Задание: Создать проект «Первые_учебные_классы». В нём разработать класс «Натуральные числа» (Natur_Chisla).

class Natur_Chisla

{

uint x, y; // закрытые поля класса

// Конструкторы:

public Natur_Chisla()

{

Console.WriteLine("Работает конструктор без параметров!");

x = y = 0;

}

public Natur_Chisla(uint x, uint y)

{

Console.WriteLine("Работает конструктор с параметрами!");

this.x = x;

this.y = y;

}

// Методы:

public void Show()

{

Console.WriteLine("x="+x+", y="+y);

}

}// конец класса

Протестируем конструкторы и метод Show() в Main().

//В Main():

Natur_Chisla Ob1 = new Natur_Chisla();

Ob1.Show();

//Выполнить!

Natur_Chisla Ob2 = new Natur_Chisla(37,18);

Ob2.Show();

//Выполнить!

Разработаем метод находящий остаток от деления первого поля класса на второе поле:

//В классе Natur_Chisla:

public uint Ostatok()

{

if (y == 0)

{

Console.WriteLine("Деление на 0!");

return[2] x;

}

if (x < y)

{

Console.WriteLine("Первое число < второго!");

return x;

}

uint x1 = x, y1 = y; // Вспомогательные переменные x1 и y1

while (x1 >= y1) // для них будет находиться остаток.

x1 -= y1; // Так делают, чтобы не повредить объект.

return x1;

}

//В Main():

Console.WriteLine("Остаток от деления полей Ob2="+Ob2.Ostatok());

//Выполнить! Получим 1

// Создадим новый объект, в котором второе поле = 0

Natur_Chisla Ob3 = new Natur_Chisla(29, 0);

Console.WriteLine("Остаток от деления полей Ob3=" + Ob3.Ostatok());

//Выполнить! Получим 29

Для проверки случая x<y можно создать ещё один объект, где будет выполняться нужное неравенство, или изменить значение уже существующего объекта.

Чтобы для проверки метода Ostatok() не создавать новые объекты или не изменять старые, рекомендуется разработать перегруженный метод – метод с параметрами.

//В классе Natur_Chisla:

public uint Ostatok(uint a, uint b)

{

if (b==0)

{

Console.WriteLine("Деление на 0!");

return a;

}

if (a < b)

return a;

while (a >= b)

a -= b;

return a;

}

//В Main():

uint a, b;

Console.WriteLine("Введите два натуральных числа!");

a = UInt32.Parse(Console.ReadLine());

b = UInt32.Parse(Console.ReadLine());

Console.WriteLine("Остаток от деления " + a + " на " + b + " = " + Ob1.Ostatok(a, b));

//Выполнить 4 раза: a>b, a<b, b==0, a==b

Разработать методы, реализующие функциональность целочисленной арифметики:

//В классе Natur_Chisla:

public uint Nod(uint a, uint b)

{

if (a == 0 || b == 0)

return 1;

while (a != b)

if (a > b)

a -= b;

else b -= a;

return a;

}

//В Main():

Console.WriteLine("Нод(" + a + "," + b + ")=" + Ob1.Nod(a, b));

//Выполнить два раза, чтобы Нод был = 1и был != 1.

//В классе Natur_Chisla:

public uint Nok(uint a, uint b)

{

return a * b / Nod(a, b);

}

//В Main():

Console.WriteLine("Нок(" + a + "," + b + ")=" + Ob1.Nok(a, b));

В классе Natur_Chisla:

public bool Wzaimno_prostie(uint a, uint b)

{

if (Nod(a, b) == 1)

return true;

else return false;

}

В return для проверки логических операций можно не использовать if, а записывать логические выражения!

public bool Wzaimno_prostie(uint a, uint b)

{

return Nod(a, b) == 1;

}

public bool Prostoe(uint a)

{

bool rez = true;

for (uint del=2; del<=a/2; del++)

if (Ostatok(a,del)==0)

{

rez = false;

break;

}

return rez;

}

//В Main():

if (Ob1.Wzaimno_prostie(a, b))

Console.WriteLine("Числа " + a + " и " + b + " - взаимно-простые!");

else

Console.WriteLine("Числа " + a + " и " + b + " - не взаимно-простые!");

//Выполнить два раза!

В классе Natur_Chisla:

public void Cifri(uint a)

{

uint cf;

while (a > 0)

{

cf = Ostatok(a, 10);

Console.WriteLine("Очередная цифра " + cf);

a /= 10;

}

}

//В Main():

Ob1.Cifri(a); //Выполнить!

Наши рекомендации