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 文件中通过以下方式调用它:

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

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

4

3 回答 3

4

查看复制和交换习语

您的代码的问题之一是它不是异常安全的。
它甚至不满足基本的异常保证

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

对象上的所有方法都应分三个阶段执行:

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

复制和交换习语将这些步骤很好地封装在一种易于使用的技术中。

于 2012-04-28T21:27:09.750 回答
3

我想String是一个char*. 那么,作为新长度的 ,或许Size需要设置为新字符串 rhs 的长度。所以它应该是rhs.Size,而不是 this->Size ,这很可能是这种情况。请注意,在 char 数组大小中也应考虑终止空字符。

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

于 2012-04-28T21:31:30.843 回答
1

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

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

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

// 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 =”的重载函数。在这个函数中,我们将薪水的值赋值给同一个类的另一个变量,这样我们就可以直接在我们的 main() 函数中使用赋值运算符。现在你可以在main()中看到,我们有两个Employee类型的变量emp1和emp2,我们可以在最后一行代码中直接使用赋值运算符,这都是因为赋值运算符重载或运算符“=”的运算符重载”。

于 2013-09-27T16:57:26.137 回答