从以上声明中可以看出,我们为String类型提供了大量且实用的接口方法,其中有相当一部分借鉴于Java中的String类型。相比于C++标准模板库中提供的string类型,新实现的String类型有以下几点优势:

  1、提供了更完整的构造函数重载方法,以使该类型的对象与其他类型,特别是和原始数据类型之间的交互更为便利。

  2、充分利用了C++中提供的操作符重载机制,使该类型的对象在使用上和原始数据类型更为贴近。

  3、Java中String类型的常用方法在该类中均能找到与之对应的方法。

  仅从上述第三点看,在整个代码移植过程中,由于几乎所有和字符串操作相关的功能在我们新实现的String类型中均能找到匹配的方法,信不信由你,这一点至关重要,因为由此而提升的代码复用程度可以大大缩短我们的移植周期,同时也降低了代码出错的几率。

  现在让我们重新回到getName()函数的效率问题上,目前而言,新的String类型在效率方面和STL中的string类型几乎是一样的,都同样会有对象拷贝动作的发生,同时也同样避免了getName()函数所在类的封装性被破坏的问题。简而言之,目前的实现方式和方法三相比存在着同样的优势和劣势,所以我们现在需要做的是如何消除额外的内存重新分配和内存数据拷贝等操作。

  为了解决这一棘手问题,我们将不得不在新的String类型中应用C++中比较常用的对象资源管理机制----引用计数,下面我们还是先看一下修订后的String类型的代码声明,之后再给出详细解释。

class String
 {
 public:
     String();
     String(const String& other);
     String(const char* otherText);
     ... ... //省略的构造函数重载方法和上面的声明相同
     ~String();
 
 public:
     const String& operator= (const String& other);
     const String& operator= (const char* otherText);
     const String& operator= (const char otherChar);
     ... ... //省略的操作符重载方法和上面的声明相同
 
 
 public:
     void append(const char* otherText,int count = -1);
     bool isEmpty() const;
     size_t length() const;
     ... ... //省略的共有方法和上面的声明相同
   
   
 private:
     class InnerRefCountedString : public RefCountedBase
     {
     public:
         InnerRefCountedString(const size_t count)
             //(count+2)是为了保证count为1的时候,不会致使_containSize为0
             :_containSize(calculateContainSize(count)),_count(count) {
             _text = new char[_containSize + 1];
             assert(_text);
         }
 
         virtual ~InnerRefCountedString() {
             delete [] _text;
         }
 
         void copyData(const char* otherText, const size_t count)  {
             assert(0 != otherText && count <= _containSize);
             memcpy(_text,otherText,count);
             _count = count;
             _text[_count] = 0;
         }
 
         void appendData(const char* appendText, const size_t appendCount) {
             assert(0 != appendText && appendCount + _count <= _containSize);
             memcpy(_text + _count,appendText,appendCount);
             _count += appendCount;
             _text[_count] = 0;
         }
 
         char* getText () const {
             return _text;
         }
       
         static size_t calculateContainSize(const size_t s) {
             return ((s + 2) >> 1) * 3;
         }
         ... ... //省略了该类的部分接口方法。
     private:
         size_t    _containSize;
         size_t    _count;
         char*    _text;
     };
 
 private:
     typedef RefCountedPtr<InnerRefCountedString> SmartString;
     SmartString    _smartText;    //托管内部字符串的对象
 };