C ++:如何实现自己的String类?

时间:2011-03-16 23:17:54

标签: c++ string

我正在尝试重新学习C ++,并想知道是否有人可以帮助我。我正在尝试实现自己的String类,看看我是否能记住它,但我仍然坚持构造函数。

我有我的头文件,并希望有一个构造函数:

头文件(MyFiles \ String.h):

#ifndef STRING_
#define STRING_

using namespace std;
#include <iostream>

class String
{
  private:

    static const unsigned int MAX = 32;    // Capacity of string

    char Mem[MAX];    // Memory to hold characters in string
    unsigned Len;     // Number of characters in string

  public:

    // Construct empty string
    //
    String()
    {
      Len = 0;
    }

    // Reset string to empty
    //
    void reset()
    {
      Len = 0;
    }

    // Return status information
    //
    bool empty() const
    {
      return Len == 0;
    }

    unsigned length() const
    {
      return Len;
    }

    // Return reference to element I
    //
    char& operator[]( unsigned I )
    {
      return Mem[I];
    }

    // Return constant reference to element I
    //
    const char& operator[]( unsigned I ) const
    {
      return Mem[I];
    }

    // Construct string by copying existing string
    //
    String( const String& );

    // Construct string by copying array of characters
    //
    String( const char [] );

    // Copy string to the current string
    //
    String& operator=( const String& );

    // Append string to the current string
    //
    String& operator+=( const String& );
};

// Compare two strings
//
bool operator==( const String&, const String& );
bool operator!=( const String&, const String& );

// Put a string into an output stream
//
ostream& operator<<( ostream&, const String& );

#endif

我坚持的一点是:

String::String(const String& str)
{
    //what goes here?
}

谢谢!

3 个答案:

答案 0 :(得分:3)

好吧,因为这是一次学习练习。

我认为你想复制其他字符串的内容,因为这是一个复制构造函数。因此,您需要复制所有成员变量。在你的情况下 复制构造函数不是必需的,因为你有一个静态数组。如果你有 动态内存(即使用new来分配指向Mem的指针)然后你需要这个。然而, 为了告诉你它是如何完成的,你走了。

String::String(const String& str)
{
    //what goes here?
    assert(str.Len < MAX);  // Hope this doesn't happen.
    memcpy(Mem, str.Mem, str.Len);
    Len = str.Len;
}

答案 1 :(得分:2)

您需要将数据从str复制到this。长度很简单:

Len = str.Len; // or, equiv. this->Len= str.Len

数据有点困难。您可以使用strcpymemcpy,甚至是for循环。

memcpy(Mem, str.Mem, sizeof Mem);
祝你好运!

答案 2 :(得分:0)

我同意Kornel Kisielewicz:手动滚动的String类越少越好。但你只是这样做才能学习,这很公平:-)。无论如何:你的拷贝构造函数需要复制Mem数组的长度和内容,就是这样。

(如果你这样做是为了做一些有用的东西而不是一个学习练习,我会添加:一个字符串类,其中包含一个固定的最大字符串长度 - 特别是一个小到32个字符的字符串 - 是一个非常糟糕的主意确实。但是如果你不想在记住更多基础知识的同时处理内存分配和释放问题,这是完全合理的。)