Listing 9

public ref class Test : ICloneable
{
     int data;
     static int objectCount = 0;
public:
     Test()
     {
          data = 0;
          ++objectCount;
     }
     Test(int value)
     {
          data = value;
          ++objectCount;
     }
     virtual String^ ToString() override
     {
          return String::Concat(data, ", ", objectCount);
     }
     virtual Object^ Clone()
     {
/*1*/          Test^ copy = static_cast<Test^>(MemberwiseClone());
/*2*/          ++objectCount;
          return copy;
     }
};
int main()
{
/*3*/     Test^ t1 = gcnew Test;
     Console::WriteLine("t1 using new:   {0}", t1);
/*4*/     Test^ t2 = static_cast<Test^>(t1->Clone());
     Console::WriteLine("t2 using Clone: {0}", t2);
/*5*/     Test^ t3 = gcnew Test(1);
     Console::WriteLine("t3 using new:   {0}", t3);
/*6*/     Test^ t4 = static_cast<Test^>(t3->Clone());
     Console::WriteLine("t4 using Clone: {0}", t4);
}
}