/********************************************************************
 ** This is an example of destructor member function in term of:
 ** 1) been called 	
 ** 2) it calls other member functions
 ** 3) Number of destructor and constructor called
 ** 4) No explicit call to the destructors
 ********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int    CONSTRUCTOR = 0;
int    DESTRUCTOR  = 0;

class number
{
  int integer;

  public:
	number(void);
	number(int);
	number(const number &);
	number(char *);
	~number(void);
	number & operator = (const number &);
	//--------------------------------------
	void print_constructor(int);
	void print_destructor(int);
};

//**********************************************************************
number::number(void)
{
    integer = 10;
    print_constructor(integer);
    CONSTRUCTOR++;
}
//**********************************************************************
number::number(int value)
{
    integer = value;
    print_constructor(integer);
    CONSTRUCTOR++;
}
//**********************************************************************
number::number(char *string)
{
    integer = atoi(string);
    print_constructor(integer);
    CONSTRUCTOR++;
}
//**********************************************************************
number::number(const number & class_1)
{
    integer = class_1.integer;
    print_constructor(integer);
    CONSTRUCTOR++;
}
//**********************************************************************
number& number::operator =(const number & class_1)
{
    integer = class_1.integer;
    printf("\n copy constructor\t %d", integer);
    return *this;
}
//**********************************************************************
number::~number(void)
{
    print_destructor(integer);
    DESTRUCTOR++;
}
//**********************************************************************
void number::print_constructor(int value)
{
   printf("\n a call to the constructor\t %d",value);
}
//**********************************************************************
void number::print_destructor(int value)
{
   printf("\n a call to the destructor\t %d",value);
}
//**********************************************************************
void test(void)
{
   system("cls");
   number   object_1;
   number   object_2(40);
   number   object_3 = object_1;
   number   object_4 = number (30);
   object_4 = object_2;
}
//**********************************************************************
main()
{
   printf("\n construct = %d\t destructor = %d",CONSTRUCTOR, DESTRUCTOR);
   test();
   printf("\n construct = %d\t destructor = %d",CONSTRUCTOR, DESTRUCTOR);
   getchar();
   return(0);
}
