特别是,代码如何检查字符的内存是否需要重新分配?或者用户输入了多少个字符? 如果我想将C字符串的值分配给我的字符串类实现,我可能会这样做
String& operator=(String& to, const char *from)
{
if((strlen(from) + 1) > to.size) {
if (to.str != NULL) {
delete[] to.str;
to.str = NULL;
}
to.size = strlen(from) + 1;
to.str = new char[to.size];
}
strcpy(to.str, from);
return to;
}
很容易。但是std::string的运算符>>确实让我感到好奇。
to.str
指向过时的内存。通常情况下,最好使用构造函数来实现赋值操作:T& T::operator=(S from) { T(from).swap(*this); return *this; }
(但无法处理抛出移动赋值的情况)。 - Dietmar Kühlto.str
的对象。(你调用了delete,但从未为其赋值!)Dietmar的建议是将=
放在其他构造函数的术语中(参见复制并交换惯用法),这是一个好建议,并避免了异常留下损坏对象的麻烦。 - Thanatosnew char[...]
可能会抛出异常,但您无法恢复to.str
的值(对于强烈的异常安全赋值,没有任何改变),并且您没有设置to.str
,至少要设置一个避免双重删除的值(也就是说,您的代码甚至没有提供基本的异常保证)。这就是为什么您的代码不具备异常安全性的全部原因。 - Dietmar Kühl