ostream& operator<<(ostream& s, string& x) { return s << x.p->s << " [" << x.p->n << "]\n"; } 
Операция ввода использует стандартную функцию ввода символьной строки (#8.4.1).
  istream& operator>>(istream& s, string& x)
  {
      char buf[256];
      s >> buf;
      x = buf;
      cout << "echo: " << x << "\n"; return s; } 
Для доступа к отдельным символам предоставлена операция индексирования. Осуществляется проверка индекса:
  void error(char* p)
  {
      cerr << p << "\n"; exit(1); } char& string::operator[](int i) { if (i<0 || strlen(p->s)s[i];
  }