运算符 + 重载

Operator+ overloading

本文关键字:重载 运算符      更新时间:2023-10-16

好的,我对运算符重载很陌生,我必须在面向对象的程序中执行这个函数,但我绝对需要帮助。以下是说明:

MyString 对象应包含一个 Print(( 方法,该方法打印 字符串

MyString 对象应包含一个 Length(( 方法,该方法报告 字符串的长度

对象应包含一个默认构造函数,该构造函数设置 初始字符串为"Hello World"的值。

MyString 对象应包含一个备用构造函数,该构造函数 允许设置字符串的初始值。

对象应重载以下运算符:

  • 应重载括号运算符以替换先前赋值的 Set 和 Get 函数。请注意,这两个实例 应该在违反字符串数组赏金时发出 exit(1(。

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

  • 逻辑比较运算符 (==(,如果两个字符串的大小和内容相同,则返回 true。

  • 返回布尔值否定 2 的否定逻辑比较运算符 (!=(。

  • 连接两个字符串的加法运算符 (+(

  • 加法/辅助运算符 (+=( 按以下方式使用:字符串 1 += 字符串 2 作为字符串 1 = 字符串 1 + 字符串 2 进行操作

  • 加法 (+( 和赋值 (=( 运算符都需要能够进行级联操作。这意味着字符串 3 = 字符串 1 + String2 或 String1 = String2 = String3 应该可以工作。

这是我在.cpp文件中的代码:

MyString::MyString()
{
       char temp[] = "Hello World";
       int counter(0);
        while(temp[counter] != '') {
              counter++;
       }
       Size = counter;
        String = new char [Size];
        for(int i=0; i < Size; i++)
            String[i] = temp[i];
}
MyString::MyString(char *message)
{
      int counter(0);
       while(message[counter] != '') {
            counter++;
        }
       Size = counter;
      String = new char [Size];
      for(int i=0; i < Size; i++)
             String[i] = message[i];
 }
 MyString::~MyString()
 {
      delete [] String;
 }
 int MyString::Length()
 {
       int counter(0);
       while(String[counter] != '')
       {
             counter ++;
        }
       return (counter);
  }
**const MyString operator +(const MyString& one, const MyString& two)
{
       MyString String1;
       return String1;
 }**

MyString& MyString::operator()(const int index, const char b)
{
       if(String[index] == '')
       {
               exit(1);
       }
       else
       {
         String[index] = b;
       }

 }
MyString& MyString::operator=(const MyString& rhs)
{
        Size = rhs.Size;
        counter = rhs.counter;
        delete [] String;
        String = new char[Size];

        for(int i = 0; i < counter+1 ; i++)
       {
               String[i] = rhs.String[i];
       }
       return *this;
 }
 bool MyString::operator==(const MyString& one)
 {
       if(one.Length() == two.Length())
       {
              for(int i = 0; i < one.Length()+1; i++)
              {
                      if(one[i] == two[i])
                            return true;
              }
       }
       else
             return false;
 }
 MyString& MyString::operator()(const int i)
 {
        if( String[i] == '')
        {
              exit(1);
        }
        else
       {
            return String[i];
       }
 }
void MyString::Print()
{
       for(int i=0; i < Size; i++)
               cout << String[i];
       cout << endl;
}

这是我在主文件中的代码:

int main (int argc, char **argv)
{
 MyString String1;             //Test of default constructor. Use "Hello world"
 MyString String2 ("Two strings are not equal");       //Test of alternate constructor
 MyString String3 ("Two strings are equal");
 MyString String4 (String1);
 cout << "*************Test of values*************" << endl;
 String1.Print ();
 String2.Print ();
 String3.Print ();
 cout << "*************Test of Length*************" << endl;
 cout << String1.Length () << " ";
 cout << String2.Length () << " ";
 cout << String3.Length () << endl;
 cout << "*************Test of Set*************" << endl;
 String1 (0, 'J');
 String1.Print ();
 cout << "*************Test of Copy*************" << endl;
 String1.Print ();
 cout << endl;
 String3.Print ();
 cout << endl;
 String3.Copy (String1);       //String1 should be copied into String3
 String1.Print ();
 cout << endl;
 String3.Print ();
 cout << endl;
 cout << "*************Test of Get*************" << endl;
 for (int i = 0; i < String1.Length (); i++)   //The last character should exit the    program
   {
      cout << String1 (i) << " ";
   }
  }
   cout << endl;
   if (String1 == String4)
   {
      String3.Print ();
   }
   else
   {
     String4.Print ();
   }
   if (String1 != String4)
   {
      String3.Print ();
   }
   else
   {
      String4.Print ();
    }
   String1 = String2 = String3;
   String1.Print ();
   String2.Print ();
   String3.Print ();

   String1 = String2 + String3 + String4;
   String1.Print ();
   String2 += String3;
   String2.Print ();
   return 0;
 }

主.cpp文件无法更改,但另一个.cpp文件必须与该文件一起编译和运行。

您需要

将运算符的声明放在标头中,但您遇到的问题是您在字符串的operator+中使用operator+

const MyString operator +(const MyString& one, const MyString& two) {
        MyString String1 = one + two; // this calls operator+, which calls operator+, which calls...
        return String1;
}

此外,由于您按值返回MyString,因此不应按const返回:

MyString operator +(const MyString& one, const MyString& two) {
        MyString String1;
        // do something with the data of one and two and put it in String1
        return String1;
}

最后,如果你的算子需要访问MyString的非公开数据,你应该将其声明为你MyString类的好友。

class MyString {
// as before
friend MyString operator+(const Mytring& rhs, const MyString& lhs);
};