我正在制作自己的字符串类(作为练习),我知道我需要一个复制构造函数和一个重载的 = 赋值运算符,但不知道从哪里开始。
该类很简单,仅存储字符串,例如
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
中。
赋值运算符必须考虑已分配的内存。
它可以重用现有分配的内存。如果新内容具有相同的长度或更短,则此方法有效。终止的
\0
将使末尾的附加内存对于常规字符串处理函数不可见。如果新字符串较大,则必须释放旧内存并分配足够大小的新 block 。
- 为了安全起见,建议检查自分配,即
this == &rhs
。如果您删除内存然后尝试从中读取数据,则会遇到问题。这允许a = a
工作。 - 返回对已修改对象的引用也是常见的做法。
这使得
a = b = c
可以正常工作。
关于c++ - 为字符串类创建复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31432878/