Пользовательский класс строки (C ++)

Я пытаюсь написать свой собственный класс C ++ String для образовательных и нужных целей.
Во-первых, я не очень разбираюсь в операторах и поэтому хочу их изучить. Я начал писать свой класс, но когда я его запускаю, он блокирует программу, но не вызывает сбоев.
Посмотрите на следующий код, пожалуйста, прежде чем читать дальше:

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);
};

Прежде всего, я не уверен, что все правильно заявил. Я пытался гуглить по этому поводу, но все учебники о перегрузке объясняют основную идею, которая очень проста, но не объясняет, как и когда каждая вещь вызывается. Например, в операторе my = программа вызывает CString (CString & str); но я не знаю почему.
Я также приложил файл cpp ниже:

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;
}

Для тестирования я использовал такой же простой код, как этот
CString a = CString ("Hello") + CString ("World");
Е (а);
Я попытался отладить его, но в какой-то момент я заблудился. Сначала он вызывает конструктор 2 раза «привет» и «мир». Тогда он попадает в оператор +, что нормально. Затем он вызывает конструктор для пустой строки. После этого он попадает в "CString (CString & str)", и теперь я заблудился. Почему это происходит? После этого я заметил, что моя строка, содержащая «Hello World», находится в деструкторе (несколько раз подряд). Я снова очень озадачен. После повторного преобразования из char * в Cstring и обратно он останавливается. Он никогда не попадает в оператор =, но и не идет дальше. printf (a) никогда не достигается.
Я использую VisualStudio 2010 для этого, но это в основном просто стандартный код C ++, и поэтому я не думаю, что это должно иметь большое значение

Ответы на вопрос(1)

Ваш ответ на вопрос