带C++的字符串

Strings with C++

本文关键字:字符串 C++      更新时间:2023-10-16

每次C++中的程序时,我都会想起一个模因"在所有可能发明用来吃米饭的器具中,两根棍子是如何胜出的"。所以让我解释一下这个问题。我想创建一个类字符串,它的行为完全符合视觉基础的字符串。

class kstring
{
    char *value;
    public:
    kstring(char *val)
    {
        value=val;
    }
    kstring operator+(kstring *val)
    {
        //some code here that works
    }
    kstring &operator=(kstring s2)
    {
        value=s2.value;
        return *this;
    }
};

所以仅此而已...创建者函数允许类似于 VB 的降级:

 kstring s="Hello World";

其他事情有点奇怪;让我们尝试使用 printf():

 printf("%sn",s); //I prefear printf as cout because more redeable

仅当私有"char *value"被声明为第一名时,它才有效。当然,s是一个指针,没有人知道在什么点上。所以编译器(代码块),幸运的是将其读取为 char 数组。但是我不知道这是否在每个编译器和环境中完成,如果正确的话,在实践中这样做,是否有更好的方法来定义它,例如 vb 指令"默认"。分配时秒 =

 kstring s,s2;
 s="try ";
 s2="again";
 s=s+s2;
 printf("%sn",s);

在调试的函数中,它完全结合了"重试",但 printf 只显示地址,所以我的赋值函数不起作用;有人建议做一个简单的类来处理字符串?

我建议学习使用std::string。 它并不完美(实际上它有很多缺陷),但它其他人都在使用的,并且已经编写好了。

与任何C++类一样,您需要担心内存管理。 也就是说,类是否拥有它所传递的指针,或者它只是假设指向内存的指针将比引用它的对象存活。 我强烈建议类应该拥有指针。

因此,构造函数需要变为:

kstring::kstring(const char* c)
{
    const auto len = strlen(c);
    value = new char[len+1];
    strcpy(value,len);
}

赋值运算符也需要类似的更改。 现在,您需要编写一个析构函数(释放内存)和一个复制构造函数(用于创建副本)。 您可能还应该添加一个移动构造函数和一个移动赋值运算符。 你可以通过假设内存总是比类长寿来节省所有这些复杂性 - 但是 a) 我不明白你怎么写operator + ,b) 它让你的调用者更难。

operator +应该是一个外部函数(有两个参数),可能需要成为类的友元(但如果你以成员身份编写operator +=则不必如此)。

不能将类对象传递给 printf 。 抱歉 - 这只是未定义的行为。 你的编译器(不)幸运。 因此,您需要定义一个将kstring转换回const char *的函数。 std::string版本称为c_str() - 您可以使用该名称或其他名称。

您还应该认真考虑允许len函数和索引。