#include <cstring>
#include <iostream>
#include <memory>

class String {
 public:
  String(const char* s) : data_(strdup(s)) {}
  ~String() { free(const_cast<char*>(data_)); }
  // Строки в Java immutable, имитирующие им C++ строки - тоже.
  String operator=(String&&) = delete;
  String operator=(const String&) = delete;
  
  friend std::ostream& operator<<(std::ostream& o,
                                  const String& s) {
    o << s.data_;
    return o;
  }
 private:
  const char* data_;
};


int main() {
  auto foo = std::make_shared<String>("foo");
  auto bar = std::make_shared<String>("bar");
  std::swap(foo, bar);
  // foo приняло значение "bar", а bar" приняло значение "foo".
  std::cout << "foo: " << (*foo) << "\n";
  std::cout << "bar: " << (*bar) << "\n";

  std::cin.get();
}