为字符串创建复制构造函数 class

Creating a copy constructor for a string class

我正在制作自己的字符串 class(作为练习),我知道我需要一个复制构造函数和一个重载的 = 赋值运算符,但不确定从哪里开始。

class 很简单,只存储字符串,例如

char* m_string;

我目前有一个标准构造函数 (MyString(const char* str)),它采用 const char* string 然后通过 m_string = new char[numChars + 1] 分配必要的内存(在计算参数中的字符数之后)

显然,我需要能够使用赋值运算符将一个字符串赋给另一个字符串,而且还希望能够从另一个字符串对象构造一个字符串对象。即

MyString(const MyString& str)
{
}

关于重载=赋值运算符

然后我是否根据字符数获取 rhs 和 lhs 的长度,然后根据 rhs 比 lhs 长还是短来调整内存量?

我不一定想要完整的答案,因为我不相信你仅仅从被告知的答案中学到任何东西,但是一些正确方向的建议和指导将不胜感激。

谢谢

复制构造函数必须为str的有效负载分配内存,然后复制内容。这与您已有的构造函数非常相似,只是 char * 不是直接作为参数给出,而是 str.

中的 "hidden"

赋值运算符必须考虑已经分配的内存。

  • 它可以重复使用现有分配的内存。如果新内容具有相同的长度或更短,则此方法有效。终止 [=13=] 将使末尾的额外内存对常规字符串处理函数不可见。

  • 如果新字符串较大,则必须释放旧内存并分配足够大小的新块。

  • 为了安全起见,建议检查自赋值,即 this == &rhs。如果删除内存然后尝试从中读取,就会遇到问题。这允许 a = a 工作。
  • return 引用修改后的对象也是常见的做法。 这允许 a = b = c 工作。

可能这会起作用

MyString(const MyString & str) {
    m_string = new char[str.length() + 1];
    . . .    /// same as MyString(const char * str)'s definition
}

operator =

operator =(const char * str) {
    if (strcmp(mstring, str) == 0) return;    /// Optional
    delete[] mstring;
    mstring = new char[strlen(str) + 1];
    . . .    /// Same as the constructor
}