cpp为什么s.query被覆盖

时间:2018-11-08 04:49:47

标签: c++ operator-overloading

我正在研究一个使我易于构建sql语句的类。我想到的一个想法是使用运算符重载,使我可以向sql语句添加不同的值类型。话虽这么说,问题在于由于某种原因,每次我再次调用该运算符时,它似乎都覆盖了前一个调用的效果。这是我的代码:

#include <string>
#include <iostream>
using namespace std;
class sql
{
    string query;

  public:
    sql();
    void add(int i);
    void end();
    void print();
    void add_string(string str);
    sql operator+(const string &str) const;
    sql operator+(const int &i) const;
};

sql::sql()
{
    this->query = "";
}

sql sql::operator+(const int &i) const
{
    sql result;
    result.add(i);
    return result;
}

sql sql::operator+(const string &str) const
{
    sql result;
    result.add_string(str);
    return result;
}

void sql::add_string(string str)
{
    this->query = this->query + "'" + str + "',";
}

void sql::add(int i)
{
    query = query + to_string(i) + ",";
}

void sql::end()
{
    query += ";";
}

void sql::print()
{
    cout << this->query;
}

int main()
{
    sql s;
    string s1("terry");
    int i = 10;
    s = s + s1;
    s.print();
    cout << endl;
    s = s + i;
    s.print();
}

我期望的输出是:

'terry',
'terry',10,

但是是:

'terry',
10, 

为什么第二个使用+运算符会覆盖第一个的效果?

2 个答案:

答案 0 :(得分:1)

sql

创建一个新的空 result.add(i);

sql

将整数添加到空 return result; }

sql

给定的this sql sql::operator+(const int &i) const { sql result(*this); 未使用。

sql

copy根据当前的sql构造一个新的 result.add(i);

sql

将i添加到包含先前 return result; } 内容的sql中。

sql sql::operator+(const string &str) const

您将要对

做同样的事情
JOIN

答案 1 :(得分:0)

如果仔细查看operator +的实现,很明显它没有利用左侧对象。

sql sql::operator+(const string &str) const
{
    sql result;
    result.query = this->query; // concat whatever was stored in the left-side object
    result.add_string(str);
    return result;
}