gpt4 book ai didi

c++ - 赋值=运算符重载

转载 作者:太空宇宙 更新时间:2023-11-04 15:07:35 28 4
gpt4 key购买 nike

请帮助完成赋值重载函数的执行。

这是指令:

赋值运算符 (=),它将源字符串复制到目标字符串中。请注意,目标的大小需要调整为与源相同。

加法 (+) 和赋值 (=) 运算符都需要能够进行级联运算。这意味着 String3 = String1 + String2String1 = String2 = String3 应该有效。

这是我的 .cpp 文件:

 int MyString::Length()
{
int counter(0);

while(String[counter] != '\0')
{
counter ++;
}
return (counter);
}

MyString& MyString::operator=(const MyString& rhs)
{

if(this != &rhs)
{

delete [] String;
String = new char[rhs.Length()];

for(int i = 0; i <rhs.Length()+1 ; i++)
{
String[i] = rhs.String[i];
}


}
return *this;

}

它在 main.cpp 文件中被调用:

字符串 1=字符串 2=字符串 3;

我觉得我好像错过了什么。求助!!

最佳答案

查看 copy and swap idiom .

您的代码的一个问题是它不是异常安全的。
它甚至不符合 basic exception guarantee .

如果它在新操作期间抛出,您的对象将处于完全无法使用的状态。如果事实处于危险状态,因为如果由于异常而在堆栈展开期间调用析构函数,则会出现未定义的行为,因为析构函数将第二次调用 String 上的 delete。

一个对象的所有方法都应该分三个阶段进行:

  1. 完成所有可以抛出但不改变对象的工作。
    • 因此,如果您确实抛出物体,则物体会保持良好状态。
  2. 以异常安全的方式将您在 (1) 中创建的数据与对象数据交换。
    • 这就是为什么 swap() 方法不会抛出
  3. 整理并删除。
    • 可以抛出异常是因为对象再次处于一致状态。

copy-and-swap 习语以一种易于使用的技术很好地封装了这些步骤。

关于c++ - 赋值=运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10367609/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com