Open alexey-malov opened 8 years ago
Методы, возвращающие const CMyString должны возвращать CMyString, чтобы компилятор мог использовать перемещение временных объектов
удостовериться, что переполнение при сложении внутри substring выдает ожидаемые подстроки
Clear не должен бросать исключений
сделать несколько версий оператора сложения для оптимизации
перемещающий оператор присваивания не должен бросать исключений (при донор останется в невалидном состоянии) даже можно написать у него noexcept
копирующий оператор присваивания идиоматичнее реализовать через tmp copy construction+swap
оператор < должен позволять определить лексикографический порядок строк.
слова разной длины должны сравниваться по длине меншего слова. Если контент равен, то более длинное слово следует за более коротким (которое является его префиксом)
оператор > может приводить к неопределенному поведению и все остальные тоже
операторы сравнения лучше реализовать так, чтобы сравнение выполнялось за один проход.
РАсшифровка:
<=
не реализовывать через < || ==
Рекомендация: сделать int Compare(), в которой разместить проверку длин и memcmp. Операторы реализовать через эту функцию
в [] добавить assert для проверки аргументов хотя бы в отладочной конфигурации
оператор >>
реализован не по канону. Он должен заменять правый аргумент, а не аппендить
В std sting он реализован именно так
Fixed
вызов SafeDelete всегда связан с модификацией m_first на некоторое значение Зачем делать m_first равным m_emptyStr? Получать указатель можно GetStringData() в том числе и внутри класса. Тогда в SafeDelete проверка m_emptyStr не нужна
Substr у перемещенной строки обратится к нулевому указателю Проверить это в тестах
Compare() реализован неправильно, для срок с одинаковым префиксом не может вернуть отрицательное значение Если левая строка короче правой и является полным префиксом правой, результат будет "строки равны" В тестах воспроизвести эту ситуацию
Конструктор перемещения надо сделать не выбрасывающим исключений. Например, для всех пустых строк использовать массив из одного символа (статический). Указатель на данные хранить нулевой. Минимизировать количество мест в классе и его друзьях, напрямую работающих с указателями. Использовать для этих целей приватные методы. Чтобы случайно не передать нулевой указатель туда, где его использовать нельзя.