Я пытаюсь написать свой собственный класс 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 ++, и поэтому я не думаю, что это должно что-то значить