Ваш operator+
следует читать
class String
{
private:
int length;
char *chars;
String(const char* s, size_t n):
length(n),
chars(new char[n])
{
std::copy(s, s+length, chars);
}
public:
explicit String(size_t l):
length(l),
chars(new char[l])
{
}
String(char const* s):
String(s, strlen(s))
{
}
String(String const& s):
String(s.chars, s.length)
{
}
String& operator=(String s)
{
std::swap(chars, s.chars);
std::swap(length, s.length);
return *this;
}
~String() {delete[] chars;}
template<size_t N> String(const char s[N]):
String(s, N)
{
}
void append(String const& s)
{
char* tmp = new char[length + s.length];
std::copy(chars, chars+length, tmp);
std::copy(s.chars, s.chars + s.length, tmp + length);
delete[] chars;
chars = tmp;
}
template<typename S> friend S& operator<<(S&, String const&);
};
String operator+(String const& s1, String const& s2)
{
String merged(s1);
merged.append(s2);
return merged;
}
template<typename S> S& operator<<(S& stream, String const& s)
{
return stream << s.chars;
}
int main()
{
String s("bla");
std::cout << s << std::endl;
String s2 = s + "bla";
std::cout << s2 << std::endl;
}
Вы не хотите изменять аргумент, поэтому он должен быть ссылкой на константу. Что делает его неконстантный предотвращает код, как
bigString = bigString + "This is third text";
, потому что создать временную строку, если добавить без явного конструктора, не может связываться с ссылкой л-значение.
И оператор не должен быть функцией-членом, а свободной функцией, чтобы воспользоваться преобразованиями по первому аргументу. С бесплатной функцией, вы можете сделать
bigString = "This is third text" + bigString;
, что невозможно с помощью функции-члена, потому что char const[]
не имеет operator+
, который принимает String
.
PS: Вы можете прочитать Monoliths "Unstrung" для некоторого критика интерфейса std :: string.
Действительно ли это говорит 'oprator' в вашем коде? –
Вы собираетесь ответить на вопрос? Опечатка 'oprator' в реальном коде или просто ошибка копирования? Я подозреваю, что это просто ошибка копирования, потому что код даже не будет компилироваться с опечаткой. – Barmar
Вы возвращаете копию «новой» строки и, таким образом, протекаете «новую» строку. – emlai