【问题标题】:How is the string type created in c++?c++中的string类型是如何创建的?
【发布时间】:2011-07-26 04:49:04
【问题描述】:

“字符串”类型是如何在 C++ 中创建的?在 C 中,字符串是字符数组,但是 C++ 是如何将字符数组变成我们在 C++ 中所知道的“字符串”的呢?

【问题讨论】:

  • 您指的是历史细节吗?否则@Dave 的回答是正确的。
  • @In silico - 更具体地说,我试图弄清楚如何定义“字符串”而不是字符数组。编译器是否在运行时将 std::string 转换为字符数组?最后,如果没有,它是如何分配内存的?
  • @Josh Bartholf:您应该将其编辑到您的问题中,以便获得更具体的答案。

标签: c++ c arrays string character


【解决方案1】:

字符数组还在里面,只是有一个类包裹着它。想象一下这样的事情:

class String
{
private:
  char* stringData;

public:
  String(const char* str)
  {
    stringData = new char[strlen(str)+1];
    strcpy(stringData, str);
  }

  ~String() { delete[] stringData; }

  String& operator += (const String& rhs)
  {
    char* newStringData = new char[strlen(rhs) + strlen(stringData) + 1];
    strcpy(newStringData, stringData);
    strcpy(newStringData + strlen(stringData), rhs);
    delete[] stringData;
    stringData = newStringData;
    return *this;
  }
};

这显然是一个非常不完整的例子,但你明白了吧?

std::string 的实际实现非常全面,但没有什么是你自己做不到的。以下是我发布的官方 std::string 类的一些差异:

  • 字符串的长度通常作为成员变量包含在内,因此您不必一直调用 strlen 来查找长度。
  • std::string 类使用模板,因此您不限于 char 类型。如果您使用的是 Unicode,则可以使用 std::wstring,它通过将 char 类型替换为 wchar_t 类型来使用 16 位或 32 位字符串。
  • 通常有很多优化可供选择。最近最流行的是“短字符串”优化。

一旦您对 C++ 比较熟悉,您应该尝试编写自己的字符串类。这不是你在实践中会用到的东西,但它是图书馆写作的一个很好的练习。

【讨论】:

  • 非常感谢...这正是我想要弄清楚的。我想我让它变得更复杂,然后我实际上不得不这样做。
  • +1,这是一个很好的答案。只需将delete[] 用于字符数组即可。
  • 糟糕!谢谢你抓住那个。这些天我不得不处理手动内存分配的情况非常罕见。
【解决方案2】:

通过编写一个封装了很多字符串函数的类,并通过重载一堆运算符。

string 真的只是一个和其他类一样的类:

 string s = "hello"

是定义的等号运算符的重载:

 string& operator= ( const char* s );

例如。

【讨论】:

    【解决方案3】:

    它只是一个名为'string'的类,如下所示:

    class string
    {
    private:
        //members
        char* c;
    public:
        //methods
        bool operator==(const string& other) const;
    };
    

    【讨论】:

      猜你喜欢
      • 2018-12-08
      • 2012-10-19
      • 1970-01-01
      • 2017-05-24
      • 2014-08-31
      • 2011-01-02
      • 2020-06-19
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多