#include <iostream>
#include <cstdlib>
#include <stdio.h>

class String {
 public:
  String();
  String(const String &s);
  String(const char *s);
  ~String();

  int Size() const;

  char &At(int i);
  char At(int i) const;
  char &operator[](int i);
  char operator[](int i) const;
  String &operator=(const String &rhs);

 private:
  int size_;
  char *data_;
};

String::String() {
  size_ = 0;
  data_ = NULL;
}

String::String(const char *s) {
  int len = 0;
  while (s[len] != '\0') ++len;
  size_ = len;
  data_ = new char[len];
  for (int i = 0; i < len; ++i) data_[i] = s[i];
}

String::~String() {
  delete data_;
}

String::String(const String &s) {
  size_ = s.size_;
  data_ = new char[size_];
  for (int i = 0; i < size_; i++) data_[i] = s[i];
}

int String::Size() const {
  return size_;
}

char &String::At(int i) {
  return data_[i];
}

char String::At(int i) const {
  return data_[i];
}

char String::operator[](int i) const {
  return At(i);
}

char &String::operator[](int i) {
  return At(i);
}

std::ostream &operator<<(std::ostream &s, const String &str) {
  for (int i = 0; i < str.Size(); ++i) s << str[i];
  return s;
}

String operator+(const String &lhs, const String &rhs) {
  int new_size_ = lhs.Size() + rhs.Size();
  char tmp[new_size_]; //這行要加1嗎?
  for(int i = 0; i < lhs.Size(); i++){
    tmp[i] = lhs[i];
  }
  for(int i = 0; i < rhs.Size(); i++){
    tmp[i+lhs.Size()] = rhs[i];
  }
  tmp[new_size_] = '\0';
  String conString(tmp);
  return conString;
}

String &String::operator=(const String &rhs) {
  this->size_ = rhs.Size();
  data_ = new char[rhs.Size()];
  for (int i = 0; i < rhs.Size(); i++) {
        data_[i] = rhs[i];
  }
  String &refString = *this;
  return refString;
}

int main() {
  using namespace std;
  String a, b;
  cout << "a.Size(): " << a.Size() << endl;
  a = b = "Hello";
  cout << "a: " << a << endl;
  cout << "b: " << b << endl;

  String c = "world";
  cout << "c: " << c << endl;

  String d = a;
  cout << "d: " << d << endl;

  a[0] = 'h';
  cout << "a: " << a << endl;
  cout << "b: " << b << endl;
  cout << "d: " << d << endl;

  String e = a + " " + b + "!";
  cout << "e: " << e << endl;

  system("pause");
  return 0;
}
