Как реализовать операторы классов без создания новых объектов? - PullRequest
0 голосов
/ 19 марта 2020

Минимальный пример:

#include <iostream>
using namespace std;

class myint{
public:
    int x;
    myint(int x) { this->x = x;}
    ~myint() {cout << "DEL" << endl; }
    myint operator += (int const &y) { this->x += y; return y;}
};


int main() {

    myint i = myint(2);
    i += 3;

}

Я запутался, почему объект i был уничтожен дважды. Как мне избежать этого? У меня будут большие объекты, и я хочу оптимизировать код. Я не хочу создавать новые объекты при использовании операторов basi c.

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

В вашем примере, когда ваш return y; компилятор сделает неявное преобразование и сам создаст myint. Взгляните Явное ключевое слово .

Итак, из-за этого 2 объекта созданы не из одного. Первый объект в вашей основной функции и второй временный объект в вашем operator +=. Когда у нас есть два объекта, у нас есть два вызова дескриптора, когда функция main завершается.

Решение

Используйте ссылку и явное ключевое слово для безопасности:

#include <iostream>
using namespace std;

class myint {
public:
    int x;
    explicit myint(int x) { this->x = x;}
    ~myint() {cout << "DEL " <<endl; }
    myint& operator += (int const &y) { this->x += y; return *this;}
};

int main() {
    myint i = myint(2);
    i += 3;
}
0 голосов
/ 19 марта 2020

Почему ты возвращаешь y? Вы должны вернуть *this. Также сделайте тип возврата myint&.

#include <iostream>
using namespace std;

class myint {
public:
    int x;
    myint(int x) { this->x = x; }
    ~myint() { cout << "DEL" << endl; }
    myint& operator += (int const &y) { this->x += y; return *this; }
};


int main() {

    myint i = myint(2);
    i += 3;
}
...