C++ 赋值=运算符重载

C++ 赋值=运算符重载,c++,operator-overloading,cascade,assignment-operator,C++,Operator Overloading,Cascade,Assignment Operator,请帮助完成此赋值重载函数的执行 以下是说明: 赋值运算符=将源字符串复制到目标字符串中的运算符。请注意,需要将目标的大小调整为与源相同 加法+和赋值=运算符都需要能够进行级联操作。这意味着String3=String1+String2或String1=String2=String3应该可以工作 这是我的.cpp文件: int MyString::Length() { int counter(0); while(String[counter] != '\0')

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

以下是说明:

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

加法+和赋值=运算符都需要能够进行级联操作。这意味着String3=String1+String2或String1=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文件中由以下人员调用:

String1=String2=String3

我觉得我好像错过了什么。救命

退房

代码的一个问题是它不是异常安全的。 它甚至不符合标准

如果在新操作期间抛出,对象将处于完全不可用的状态。如果事实处于危险状态,因为在堆栈展开期间由于异常调用析构函数,则会出现未定义的行为,因为析构函数将再次调用字符串上的delete

对象上的所有方法应分为三个阶段:

完成所有可以抛出但不改变对象的工作。 因此,如果您确实抛出,对象将保持良好状态。 以异常安全的方式将在1中创建的数据与对象数据交换。 这就是为什么交换方法不是抛出 整理和删除。 它可以抛出,因为对象再次处于一致状态。 复制和交换习惯用法以一种易于使用的技术很好地封装了这些步骤。

我想字符串是char*。然后,可能需要将大小(即新长度)设置为rhs的长度(即新字符串)。所以它应该是rhs.Size,而不是可能是这个->Size。请注意,字符数组大小中也应考虑终止空字符


之后,您可以进入循环,再次处理所有字符和终止的空字符。如果我们不知道计数器是什么,假设它是没有空字符的新字符串长度,因此,+0占1,我想循环没有任何问题。

< P>在开始赋值运算符重载之前,让我们看C++中的运算符重载。在面向对象编程中,运算符重载(不太常见,称为运算符特殊多态性)是多态性的一种特殊情况,不同的运算符根据其参数具有不同的实现。运算符重载通常由语言、程序员或两者共同定义。之所以使用运算符重载,是因为它允许开发人员使用更接近目标域的符号进行编程,并允许用户定义类型具有与语言中内置类型类似的语法支持级别。例如,它在科学计算中很常见,在科学计算中,它允许用与纸上相同的语法操作数学对象的计算表示。可以使用函数调用模拟对象重载

现在我们如何重载赋值运算符=

在我们完成这个赋值操作符重载之后,我们将能够分配两个自定义数据类型的变量。让我们看一下下面的示例:

// Operator overloading in C++
//assignment operator overloading
#include<iostream>
using namespace std;

class Employee
{
private:
int idNum;
double salary;
public:
Employee ( ) {
    idNum = 0, salary = 0.0;
}

void setValues (int a, int b);
void operator= (Employee &emp );

};

void Employee::setValues ( int idN , int sal )
{

salary = sal; idNum = idN;

}

void Employee::operator = (Employee &emp)  // Assignment operator overloading function
{
salary = emp.salary;
}

int main ( )
{

Employee emp1;
emp1.setValues(10,33);
Employee emp2;
emp2 = emp1;        // emp2 is calling object using assignment operator

}
现在让我们解释一下重载“=”运算符的代码,我们使用函数“setValues”将值分配给“idN”和“sal”,该函数是类“Employee”的公共成员函数,现在我们的重点是定义为“operator=”的重载函数。在这个函数中,我们将salary的值赋给同一类的另一个变量,这样我们就可以在主函数中直接使用赋值运算符。正如您在main中所看到的,我们有两个emp1和emp2类型的Employee变量,我们可以在最后一行代码中直接使用赋值运算符,这都是因为赋值运算符重载或运算符“=”的运算符重载

更多信息,请访问:
在异常面前考虑正确性!具体问题是什么?您正在保留此->大小字符,您正在复制此->计数器字符。这不是RHS。大小还是RS.Car?你也忘记更新这些变量了,你有4个问题,本质上是问相同的事情。整洁和删除不应该做,因为在C++中我们使用智能指针。是吗?@MooingDuck:智能指针是一种实现技术。原则仍然认为,这是一个清理和恢复阶段。此外,字符串实际上是一个容器,因此智能指针并不真正适用。智能指针和容器是不同的,但应用于内存管理的并行技术。所以当我说String=new char[Size.Length]时,这就是你的意思吗?或者应该这样声明,Size=rhs.Size;是的,我搞错了循环,但我已经编辑了它。在“delete[]String”之后,应该这样做:“Size=rhs.Size”。完成后
,新的“String”应该是:“String=new char[rhs.Size]”,或者只是“String=new char[Size]”,因为“Size”现在等于“rhs.Size”。如果大小忽略终止字符,则向其添加一个。这里的要点是,您需要使任何成员变量等于作为参数传递给赋值运算符的对象。但最终,您必须使用复制和交换,或者解决如何以异常安全的方式编写它。复制和交换的习惯用法也只有三行,所以一旦你知道它,写起来也会更容易。谢谢你的帮助!我已经弄明白了!: