Benutzerdefinierte Zeichenfolgenklasse (C ++)

Ich versuche, meine eigene C ++ String-Klasse für Bildungs- und Bedarfszwecke zu schreiben.
Das erste ist, dass ich nicht so viel über Bediener weiß und deshalb möchte ich sie lernen. Ich habe angefangen, meine Klasse zu schreiben, aber wenn ich sie starte, blockiert sie das Programm, führt aber keinen Absturz aus.
Sehen Sie sich bitte den folgenden Code an, bevor Sie weiterlesen:

class CString
{
private:
  char* cstr;
public:
  CString();
  CString(char* str);
  CString(CString& str);
  ~CString();

  operator char*();
  operator const char*();
  CString operator+(const CString& q)const;
     CString operator=(const CString& q);
};

Zunächst bin ich mir nicht so sicher, ob ich alles richtig erklärt habe. Ich habe versucht, darüber zu googeln, aber alle Tutorials zum Überladen erklären die Grundidee, die sehr einfach ist, aber nicht erklärt, wie und wann jedes Ding aufgerufen wird. Zum Beispiel ruft das Programm in my = operator CString (CString & str); aber ich habe keine idee warum.
Ich habe auch die folgende CPP-Datei angehängt:

CString::CString()
{
 cstr=0;
}
CString::CString(char *str)
{
 cstr=new char[strlen(str)];
 strcpy(cstr,str);
}
CString::CString(CString& q)
{
 if(this==&q)
  return;
 cstr = new char[strlen(q.cstr)+1];
 strcpy(cstr,q.cstr);
}
CString::~CString()
{
 if(cstr)
  delete[] cstr;
}
CString::operator char*()
{
 return cstr;
}
CString::operator const char* ()
{
 return cstr;
}
CString CString::operator +(const CString &q) const
{
 CString s;
 s.cstr = new char[strlen(cstr)+strlen(q.cstr)+1];
 strcpy(s.cstr,cstr);
 strcat(s.cstr,q.cstr);
 return s;
}
CString CString::operator =(const CString &q)
{
 if(this!=&q)
 {
  if(cstr)
   delete[] cstr;
  cstr = new char[strlen(q.cstr)+1];
  strcpy(cstr,q.cstr);
 }
 return *this;
}

Zum Testen habe ich einen Code verwendet, der genauso einfach ist wie dieser
CString a = CString ("Hallo") + CString ("Welt");
printf (a);
Ich habe versucht, es zu debuggen, aber irgendwann verliere ich mich. Zuerst ruft er den Konstruktor zweimal für "Hallo" und für "Welt" auf. Dann kommt es in den + Operator, was in Ordnung ist. Dann ruft es den Konstruktor für die leere Zeichenfolge auf. Danach geht es in "CString (CString & str)" und jetzt bin ich verloren. Warum passiert dies? Danach bemerkte ich, dass mein String mit "Hello World" im Destruktor ist (einige Male hintereinander). Wieder bin ich sehr verwirrt. Nach erneuter Konvertierung von char * nach Cstring und hin und her stoppt es. Es kommt nie in den Operator =, aber es geht auch nicht weiter. printf (a) wird nie erreicht.
Ich benutze VisualStudio 2010 dafür, aber es ist im Grunde genommen nur Standard-C ++ - Code und daher denke ich nicht, dass es einen großen Unterschied machen sollte.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage