#include <stdio.h> 
#include <string.h>

struct mytype 
{ 
    mytype(char *s) : str(s) 
    { 
        prev_term = 0;
        leng = ::strlen(s);
    } 
    ~mytype() 
    {
        printf("\nin destructor for \"%s\"", str);
        str[leng] = prev_term;
    } 
    mytype() {}
    mytype(const mytype& mt)         //copy constructor.
    {
       printf("\nin copy constructor with \"%s\"", mt.str);
    }
    
    mytype subZstr(int ofst, int len)//a null-terminated substring.
    {
       mytype ret;
       ret.leng = len;
       ret.str = str+ofst;
       ret.prev_term = ret.str[len]; //remember previous terminator.
       ret.str[len] = 0;             //null terminate.
       return ret;
    }

    operator char* () { return str; } 

    char *str; 
    int  leng;
    char prev_term;
};//mytype 

int main() 
{ 
  char my_str[] = "A new way to do it"; 
  mytype m(my_str);
  printf("\ncast substring: \"%s\"", (char*)(m.subZstr(2,7)));//"new way"
  printf("\nnon-cast substring: \"%s\"", m.subZstr(2,7));//"new way"
  printf("\noriginal string: \"%s\"", (char*)m); 

  return 0; 
} 

