重载运算符返回类型

时间:2014-07-16 11:08:45

标签: c++ oop

是否可以重载一个返回字符串而不是类类型的操作符?

string operator++() {
    index++;
    if (index > num_atts) {
        index = 0;
    }

    string ret = att_names[index];
    return ret;

}

2 个答案:

答案 0 :(得分:1)

该代码在语法上没有错误。但是,它在语义上存在严重错误。

const char *operator++() {
    index++;
    if (index > num_atts) {
        index = 0;
    }

    string ret = att_names[index]; // 1
    return ret.c_str();            // 2 & 3
}                                  // 4
  1. 创建ret对象
  2. 您致电ret.c_str()ret对象为您创建c-string,并将其返回。
  3. 现在,您正在尝试返回c-string。
  4. 但此时,ret被销毁,它也会销毁c-string,因为该c-string的所有者是ret
  5. 因此,现在您正在返回已销毁的指针!!

答案 1 :(得分:0)

您可以返回任何您喜欢的类型,就像您编写的任何其他功能一样。但就像任何其他函数一样,您无法返回指向即将超出范围的本地堆栈变量的指针,即未定义的行为。最简单的方法是简单地返回string,例如:

std::string operator++() {
    // ...
    return ret;
}