#include <algorithm>
#include <iostream>
#include <cstring>
class String
{
int length_;
char * data_;
public:
String()
: length_ { 0 }
, data_ { nullptr }
{
}
String(char const * str, int len = 0)
: length_ { static_cast<int>(len ? len : strlen(str)) }
, data_ { new char[length_ + 1] }
{
strcpy(data_, str);
}
String(String const & orig)
: length_ { orig.length_ }
, data_ { new char[length_ + 1] }
{
strcpy(data_, orig.data_);
}
String & operator = (String const & orig)
{
String tmp { orig };
swap(tmp);
return *this;
}
~String()
{
delete[] data_;
}
void swap(String & other)
{
if (this == &other) return;
std::swap(length_, other.length_);
std::swap(data_, other.data_);
}
String operator + (String const & rhs) const
{
String result;
result.length_ = length_ + rhs.length_ + 1;
result.data_ = new char[result.length_];
strcpy(result.data_, data_);
strcat(result.data_, rhs.data_);
return result;
}
char const * c_str() const
{
return data_;
}
};
int main()
{
String foo { "foo" };
String bar { "bar" };
std::cout << (foo + bar).c_str() << std::endl;
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KCmNsYXNzIFN0cmluZwp7CglpbnQgbGVuZ3RoXzsKCWNoYXIgKiBkYXRhXzsKCQpwdWJsaWM6CglTdHJpbmcoKQoJCTogbGVuZ3RoXyB7IDAgfQoJCSwgZGF0YV8geyBudWxscHRyIH0KCXsKCX0KCQoJU3RyaW5nKGNoYXIgY29uc3QgKiBzdHIsIGludCBsZW4gPSAwKQoJCTogbGVuZ3RoXyB7IHN0YXRpY19jYXN0PGludD4obGVuID8gbGVuIDogc3RybGVuKHN0cikpIH0KCQksIGRhdGFfIHsgbmV3IGNoYXJbbGVuZ3RoXyArIDFdIH0KCXsKCQlzdHJjcHkoZGF0YV8sIHN0cik7Cgl9CgkKCVN0cmluZyhTdHJpbmcgY29uc3QgJiBvcmlnKQoJCTogbGVuZ3RoXyB7IG9yaWcubGVuZ3RoXyB9CgkJLCBkYXRhXyB7IG5ldyBjaGFyW2xlbmd0aF8gKyAxXSB9Cgl7CgkJc3RyY3B5KGRhdGFfLCBvcmlnLmRhdGFfKTsKCX0KCQoJU3RyaW5nICYgb3BlcmF0b3IgPSAoU3RyaW5nIGNvbnN0ICYgb3JpZykKCXsKCQlTdHJpbmcgdG1wIHsgb3JpZyB9OwoJCXN3YXAodG1wKTsKCQlyZXR1cm4gKnRoaXM7Cgl9CgkKCX5TdHJpbmcoKQoJewoJCWRlbGV0ZVtdIGRhdGFfOwoJfQoJCgl2b2lkIHN3YXAoU3RyaW5nICYgb3RoZXIpCgl7CgkJaWYgKHRoaXMgPT0gJm90aGVyKSByZXR1cm47CgkJc3RkOjpzd2FwKGxlbmd0aF8sIG90aGVyLmxlbmd0aF8pOwoJCXN0ZDo6c3dhcChkYXRhXywgb3RoZXIuZGF0YV8pOwoJfQoJCglTdHJpbmcgb3BlcmF0b3IgKyAoU3RyaW5nIGNvbnN0ICYgcmhzKSBjb25zdAoJewoJCVN0cmluZyByZXN1bHQ7CgkJcmVzdWx0Lmxlbmd0aF8gPSBsZW5ndGhfICsgcmhzLmxlbmd0aF8gKyAxOwoJCXJlc3VsdC5kYXRhXyA9IG5ldyBjaGFyW3Jlc3VsdC5sZW5ndGhfXTsKCQlzdHJjcHkocmVzdWx0LmRhdGFfLCBkYXRhXyk7CgkJc3RyY2F0KHJlc3VsdC5kYXRhXywgcmhzLmRhdGFfKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoJCgljaGFyIGNvbnN0ICogY19zdHIoKSBjb25zdAoJewoJCXJldHVybiBkYXRhXzsKCX0KfTsKCmludCBtYWluKCkKewoJU3RyaW5nIGZvbyB7ICJmb28iIH07CglTdHJpbmcgYmFyIHsgImJhciIgfTsKCXN0ZDo6Y291dCA8PCAoZm9vICsgYmFyKS5jX3N0cigpIDw8IHN0ZDo6ZW5kbDsKCXJldHVybiAwOwp9Cg==