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

Creating a copy constructor for a string class

本文关键字:复制 构造函数 创建 字符串      更新时间:2023-10-16

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

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

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中。

赋值操作符必须考虑已分配的内存。
  • 它可以重用现有分配的内存。如果新内容具有相同的长度或更短,则此方法有效。终止的将使末尾的额外内存对常规字符串处理函数不可见。

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

  • 为了安全起见,建议检查自赋值,即this == &rhs。如果你删除内存,然后试图从中读取,你会遇到问题。
  • 允许a = a工作。返回对修改过的对象的引用也是一种常见的做法。这允许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
}