C++ 为字符串类创建副本构造函数
我正在创建自己的字符串类(作为练习),我知道我需要一个复制构造函数和重载的=赋值运算符,但不确定从何处开始 该类很简单,只存储字符串,例如C++ 为字符串类创建副本构造函数,c++,string,constructor,copy-constructor,C++,String,Constructor,Copy Constructor,我正在创建自己的字符串类(作为练习),我知道我需要一个复制构造函数和重载的=赋值运算符,但不确定从何处开始 该类很简单,只存储字符串,例如 char* m_string; 我目前有一个标准构造函数(MyString(const char*str)),它接受一个const char*string,然后通过m_string=new char[numChars+1]分配必要的内存(在计算参数中的字符数之后) 显然,我需要能够使用赋值运算符将一个字符串赋值给另一个字符串,但也希望能够从另一个字符串构造
char* m_string;
我目前有一个标准构造函数(MyString(const char*str)
),它接受一个const char*string
,然后通过m_string=new char[numChars+1]
分配必要的内存(在计算参数中的字符数之后)
显然,我需要能够使用赋值运算符将一个字符串赋值给另一个字符串,但也希望能够从另一个字符串构造字符串对象。i、 e
MyString(const MyString& str)
{
}
关于重载=赋值运算符
然后,我是否根据字符数获得rhs和lhs的长度,然后根据rhs比lhs长还是短来调整内存量
我不一定想要完整的答案,因为我不相信你仅仅从被告知答案中学到任何东西,但是如果你能提供一些正确方向的建议和指导,我将不胜感激
谢谢复制构造函数必须为
str
的有效负载分配内存,然后复制内容。这与您已有的构造函数非常相似,只是char*
不是直接作为参数提供的,而是在str
中“隐藏”的
赋值运算符必须考虑已分配的内存
- 它可以重用现有分配的内存。如果新内容的长度相同或更短,则此操作有效。终止
将使末尾的附加内存对常规字符串处理函数不可见\0
- 如果新字符串较大,则必须释放旧内存并分配足够大的新块
- 为了安全起见,建议检查自我分配,即
。如果你删除内存,然后尝试从中读取,你会遇到问题。这允许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 =(const char * str) {
if (strcmp(mstring, str) == 0) return; /// Optional
delete[] mstring;
mstring = new char[strlen(str) + 1];
. . . /// Same as the constructor
}
这就是我的想法,我是否先删除Lhs的内存,然后用另一个
新的完全重新分配它?@未知它是一个构造函数。没有分配给删除的内存。@unknownSPY否,因为它是一个构造函数,所以没有什么可删除的。啊,好的-谢谢,这很有意义。重载=赋值运算符的情况如何?@unknownSPY对于运算符=()
,您是对的,您有一个现有的对象,必须释放(或重用,如果现有缓冲区足够大,并且您希望减少内存分配)其内存以避免内存泄漏。是否应该删除mstring
是删除[]mstring
?@unknownSPY是,已修复。您也可以添加相等性检查,但它是基于意见的代码>而不是strcmp()
。这里的问题是关于别名的。@DanAllen两者都是C样式的字符串,这将如何工作?这里的危险是delete[]mstring
正在删除str
,因为它是别名。事实上,您需要处理指向“内部”mstring的str
。假设str==mstring+1
您的测试将为false,但代码仍将失败。