#include <cstring>

class String
{
	struct StringValue
	{
		int refCount;
		char*data;
		StringValue (const char* initValue);
		~StringValue ();
	};
	StringValue *value;
public:
	String(const char* initValue="");
	String(const String& rhs);
	String& operator= (const String& rhs);
	~String();
};

String::String(const char*initValue) :
	value(new StringValue(initValue))
{ }

String::String(const String& rhs) :
	value(rhs.value)
{
	++value->refCount;
}

String::operator = (const String& rhs)
{
	if (value == rhs.value) return *this;
	if (--value->refCount == 0) delete value;
	value = rhs.value;
	++value->refCount;
	return *this;
}

String::~String()
{
	if (--value->refCount == 0) delete value;
}

String::StringValue::StringValue(const char* initValue)
	:refCount(1)
{
	data = new char[std::strlen(initValue) + 1];
	std::strcpy (data, initValue);
}

String::StringValue::~StringValue()
{
	delete data;
}

int main()
{
	String s1 ("More Effective C++");
	String s2 = s1;
}

