为字符串创建复制构造函数 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
}
我正在制作自己的字符串 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
.
赋值运算符必须考虑已经分配的内存。
它可以重复使用现有分配的内存。如果新内容具有相同的长度或更短,则此方法有效。终止
[=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
}