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

标签 c++ string constructor copy-constructor

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

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

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/

相关文章:

string - SmallTalk 中的字符串解析

c# - 如何在 C# 中创建自己的对象,该对象只能具有已定义的有限数量的值,例如像 Haskell 中的 Bools?

c++ - 使用构造函数参数实例化类对象和不带参数 C++ 的 * 运算符之间的区别

C++ 流程图/GUI 设计器

c++ - 使用 C++20 三向比较进行更静默的行为变化

c - C : convert escape sequences into visible ones 的 K&R 中的练习 3-2

C++ : constructor setting wrong values

c++ - OS X Yosemite gcc 无法识别的命令行选项 'mdll' 在 brew install gcc 之后

c++ - 在类类内不必要使用枚举类

C++ 编译器选择了错误的命名空间