Некоторые комментарии к вашему коду:
MyString1()
{
//no arg constructor
Возможно, ваша инструкция требует этого, но в целом это такой комментарий, который хуже бесполезного.Комментарии должны сообщать читателю о вещах, которые не очевидны с первого взгляда на код.
char *string;
string = new char[0];
string[0] ='\0';
Это вызывает неопределенное поведение.Разрешается вызов new с нулевыми элементами, но вы не можете разыменовать то, что он возвращает (он может возвращать нулевой указатель или может возвращать ненулевой указатель, который не ссылается на какое-либо хранилище).В большинстве случаев лучше установить указатель в NULL.
std::cout << string;
Какой смысл писать пустую строку?
size = 1;
Строка пуста, так чтоНормальная фигура, размер равен нулю.
//constructor receives pointer to character array
По-прежнему бесполезен.
MyString1(char* chars)
Поскольку вы не планируете (или не должны в любом случае) изменять входные данные, этопараметр должен быть char const *
.
{
int index = 0;
//Determine the length of the array
while (chars[index] != NULL)
index++;
. Хотя это работает, «NULL» действительно должен быть зарезервирован для использования в качестве указателя, по крайней мере, IMO.Я написал бы что-то вроде:
while (chars[index] != '\0')
++index;
Если вы не используете предыдущее значение, предпочитайте предварительное увеличение вместо пост-увеличения.
//Allocate dynamic memory on the heap
В отличие от выделения статической памятив куче?
MyString1 MyString2;
Использование одного и того же соглашения об именах для типов и переменных сбивает с толку.
while (string[index] != NULL)
Тот же комментарий о NULL, что и здесь, применяется ранее.
MyString1 append(MyString1 s)
IMO, сама идея этой функции просто неверна - если у вас есть строка, и вы просите ее добавить что-то к вашей строке, она уничтожает вашу исходную строку и (что еще хуже) оставляет еев непригодном для использования состоянии - когда вы дойдете до добавления деструктора, который освобождает память, принадлежащую строке, это приведет к двойному удалению хранилища строки, которая была объектом (жертвой?) вызова append
Я бы подумал написать частную функцию «копирования» и использовать ее в реализациях некоторых (большинства?) того, что вы здесь показали.
Как немногоиз более общего совета, яЯ бы рассмотрел еще пару возможностей: во-первых, вместо того, чтобы всегда выделять ровно количество места, необходимого для строки, я бы рассмотрел округление выделения до (скажем) степени два.Во-вторых, если вы хотите, чтобы ваш строковый класс работал хорошо, вы можете рассмотреть возможность реализации «оптимизации коротких строк».Это состоит из выделения места для короткой строки (например, 20 символов) в теле самого строкового объекта.Поскольку многие строки имеют тенденцию быть относительно короткими, это может значительно повысить скорость (и уменьшить фрагментацию кучи и т. Д.), Избегая распределения кучи, если строка короткая.