Почему указатель char выделяется с помощью new
Привет, я построил свой собственный класс string, где я использую char* str
ниже приведен фрагмент кода
Снизу фрагмент кода, в параметров и конструктор копирования
ул. КСТР = ; //эта часть заявления работает нормально.
но даже тогда, почему мне нужно выделять память с помощью new, а затем strcpy требуется?
cstr = новый символ[strlen (str) +1];
strcpy(cstr, str);
обе работы хорошо. но зачем выбирать метод динамического распределения?
Что я уже пробовал:
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); }; CString::CString() { cout << "constructor" << endl; cstr = 0; } CString::CString(char *str) { cout << " param constructor" << endl; //cstr = str;// this works fine even then we allocating with new why??? cstr = new char[strlen(str) +1]; strcpy(cstr, str); } CString::CString(CString& q) { cout << " copy constructor" << endl; if (this == &q) return; cstr = q.cstr; //cstr = new char[strlen(q.cstr) + 1]; //strcpy(cstr, q.cstr); } CString::~CString() { //if (cstr) // delete[] cstr; } CString::operator char*() { cout << " operatorcahr*" << endl; return cstr; } //CString::operator const char* () //{ // cout << " const operatorcahr*" << endl; // return cstr; //} CString CString::operator +(const CString &q) const { cout << "operator +*" << endl; 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) { cout << "operator =" << endl; if (this != &q) { //if (cstr) //delete[] cstr; cstr = new char[strlen(q.cstr) + 1]; strcpy(cstr, q.cstr); } return *this; } int _tmain(int argc, _TCHAR* argv[]) { CString a = CString("Hello") + CString(" World"); cout << a << endl; getchar(); return 0; }
Philippe Mori
Хотя написание класса string-это хорошее упражнение, обычно следует использовать стандартный класс string в производственном коде, поскольку стандартный класс был закодирован экспертами, которые лучше понимают подобные ловушки.
Philippe Mori
Один из примеров, когда ваш код, вероятно, потерпит неудачу, - это CString a = CString() + CString(" World");
То есть если вы замените первый вызов конструктора так, чтобы использовался конструктор по умолчанию.
Также operator=
должен вернуть ссылку.