如何重载+ =运算符来返回一个字符串?

时间:2016-10-31 20:17:30

标签: c++ overloading operator-keyword

我只是有一个简单的问题:如何重载+ =运算符以返回字符串。这是我尝试过的,但没有成功。

// 'Student' is the class that this function is in
// 'get_name()' returns the name of the student
// 'get_grade()' returns the grade of the student
// Description:
// Ultimately I will be creating a list of students and their grades in
// the format of (Student1, Grade1) (Student2, Name2) ... (StudentN, GradeN)
// in a higher level class, and thus I need an overloaded += function.
Student& Student::operator+=(const Student& RHS)
{
    string temp_string;
    temp_string = "( " + RHS.get_name() + ", " + RHS.get_grade() + ") ";
    return temp_string;
}

1 个答案:

答案 0 :(得分:7)

纯技术:

// v NO reference here!
std::string Student::operator+=(const Student& rhs)
{
    string temp_string;
    temp_string = "( " + rhs.get_name() + ", " + rhs.get_grade() + ") ";
    return temp_string;
}

<强> BUT:

这是什么意思?首先,一般两个学生的总和结果是什么?另一个学生?你会如何解释人类语言?开始让人困惑。然后看看以下内容:

int x = 10;
x += 12;

您希望x之后保持值22.特别是:x被修改(除非您添加了零...)。相比之下,您的运营商不会以任何方式修改this - 它甚至没有看到......您如何解释将另一位学生添加到this 现在?特别是:有一个操作员+接受两个学生,你可以返回某种对或家庭,但用+ =,改变结果类型???如果x += 7没有修改x,但返回了双倍,该怎么办?你觉得这一切有多混乱吗?

另一方面,我可以想象,你实际上是在寻找显式的强制转换运算符:

operator std::string()
{
    std::string temp_string;
    temp_string = "( " + this->get_name() + ", " + this->get_grade() + ") ";
    return temp_string;
}

这样,您可以将学生添加到字符串中,例如: G。像这样:

Student s;
std::string str;
str += s;

或者您想将学生传递给输出流吗?然后这个:

std::ostream& operator<<(std::ostream& stream, Student const& s)
{
    stream << "( " << s.get_name() << ", " << s.get_grade() << ") ";
    return stream;
}

如上所述,您可以将强制转换操作符减少为:

operator std::string()
{
    std::ostringstream s;
    s << *this;
    return s.str();
}

甚至可以有一个班轮:

operator std::string()
{
    return static_cast < std::ostringstream& >(std::ostringstream() << *this).str();
}

嗯,承认,如果真的更好,这种演员必须是有争议的......