//продемонстрировать перегрузку конструктора.
using System;
class MyClass
{
public int x;
public MyClass()
{
Console.WriteLine("В конструкторе MyClass().");
x = 0;
}
public MyClass(int i)
{
Console.WriteLine("В конструкторе MyClass(int).");
x = i;
}
public MyClass(double d)
{
Console.WriteLine("В конструкторе MyClass(double).");
x = (int)d;
}
public MyClass(int i, int j)
{
Console.WriteLine("В конструкторе MyClass(int i,int j).");
x = i * j;
}
}
class OverloadConsDemo
{
static void Main()
{
MyClass t1 = new MyClass();
MyClass t2 = new MyClass(88);
MyClass t3 = new MyClass(17.23);
MyClass t4 = new MyClass(2, 4);
Console.WriteLine("t1.x: {0}\nt2.x: {1}\nt3.x: {2}\nt3.x: {3}", t1.x, t2.x, t3.x, t4.x);
}
}
Одна из самых распространенных причин для перегрузки конструкторов заключается в необходимости предоставить возможность одним объектам инициализировать другие. В качестве примера ниже приведен усовершенствованный вариант разработанного ранее класса Stack, позволяющий конструировать один стек из другого.
// класс для хранения символов в стеке.
using System;
class Stack
{
//эти члены клавва являются закрытыми
char[] stck; //массив, содержащий стек
int tos; //индекс вершины стека
//сконструировать пустой обьект класса Stack по заданному размеру стека
public Stack(int size)
{
stck = new char[size]; //распределить память для стека
tos = 0;
}
//сконструировать обьект класса Stack из существующего стека.
public Stack(Stack ob)
{
//распределить память для стека.
stck = new char[ob.stck.Length];
//скопировать элементы в новый стек.
for (int i = 0; i < ob.tos; i++)
stck[i] = ob.stck[i];
//установить переменную tos для нового стека.
tos = ob.tos;
}
//поместить вимволы в стек.
public void Push(char ch)
{
if (tos == stck.Length)
{
Console.WriteLine(" - Стек заполнен");
return;
}
stck[tos] = ch;
tos++;
}
//извлечь символ из стека.
public char Pop()
{
if (tos == 0)
{
Console.WriteLine(" - Стек пуст.");
return (char)0;
}
tos--;
return stck[tos];
}
//возвратить значение true, если стек заполненж
public bool IsFull()
{
return tos == stck.Length;
}
//возвратить значение true, если стек пуст.
public bool IsEmpty()
{
return tos == 0;
}
//возвратить общую емкост стека.
public int Capacity()
{
return stck.Length;
}
//возврать количество обьектов, находящихся в настоящий момент в стеке.
public int GetNum()
{
return tos;
}
}
//продемострировать применение класса Stack;
class StackDemo
{
static void Main()
{
Stack stk1 = new Stack(10);
char ch;
int i;
//поместить ряд символов в стек stk1.
Console.WriteLine("Поместить символы A-J в стек stk1.");
for (i = 0;!stk1.IsFull(); i++)
stk1.Push((char)('A' + i));
//создать копию стека stck1
Stack stk2 = new Stack(stk1);
//вывести содержимое стека stk1
Console.Write("Содержимое стека stk1: ");
while (!stk1.IsEmpty())
{
ch = stk1.Pop();
Console.Write(ch);
}
Console.WriteLine();
Console.Write("Содержимое стека stk2: ");
while (!stk2.IsEmpty())
{
ch = stk2.Pop();
Console.Write(ch);
}
Console.WriteLine("\n");
}
}