运算符 + 重载
Operator+ overloading
好的,我对运算符重载很陌生,我必须在面向对象的程序中执行这个函数,但我绝对需要帮助。以下是说明:
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);
};
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 重载运算符new[]的行为取决于析构函数
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 在 myVector 类中重载运算符 + 时出错
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 如何在 cpp 中重载运算符 +=?
- C++ 如何重载 [] 运算符并进行函数调用
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 重载运算符有地址吗?
- 如何迭代重载运算符 [] 的类?
- 重载运算符与添加问题
- 模板基类中的重载运算符
- 如何调用用于重载运算符"<<"的 friend 函数?
- 在 C++17 中的命名空间和子命名空间中重载运算符是不明确的
- 重载运算符<<采用谷歌 C++ 风格
- C++ 如何正确重载 + 运算符
- cout (<<) 重载运算符不打印减去的矩阵
- 如何在 c++ 中重载运算符 + 以便能够 whrite c_str = "smth" + c_str;
- 重载运算符*以获取对另一个类的实例的引用