Я перегрузил оператор "+" для моего класса Vector
как показано ниже. Теперь в основной программе я использую этот оператор в двух случаях:
Второй аргумент operator+
- это std::vector
вместо объекта Vector
. Я не понимаю, почему вызывается 2-й конструктор или почему вызван деструктор, и кажется, что std::vector
автоматически преобразуется в объект Vector
.
Второй аргумент operator+
- это Vector
объект. Я не понимаю, почему вызывается второй конструктор.
Благодарю.
vector.h:
#include <iostream>
#include <vector>
#include <assert.h>
#include <functional> // plus
#include <algorithm> // transform
#include <iterator> // back_inserter
class Vector
{
private:
std::vector<int> base;
public:
Vector(); // dflt ctor
Vector(const std::vector<int> vec); // 2nd ctor
Vector(const Vector& vec); // copy ctor
~Vector();
Vector& operator=(const Vector& rhs);
Vector operator+(const Vector& rhs);
void getBase();
};
Соответствующие определения в Vector.cpp:
Vector::Vector(const std::vector<int> vec)
{
std::cout << "2nd ctor \n";
if(vec.empty())
{
base.push_back(0);
}
else
{
base = vec;
}
}
Vector Vector::operator+(const Vector& rhs)
{
assert( base.size() == rhs.base.size() );
std::vector<int> result;
result.reserve(base.size());
std::transform(base.begin(), base.end(), rhs.base.begin(), std::back_inserter(result), std::plus<int>());
return result;
}
Vector::~Vector()
{
std::cout << "dtor \n";
}
main.cpp:
#include "Vector.h"
int main()
{
int arr1[] = {1,2,3,4,5};
int arr2[] = {10,20,30,40,50};
std::vector<int> vec1 (arr1, arr1 + sizeof(arr1) / sizeof(arr1[0]));
std::vector<int> vec2 (arr2, arr2 + sizeof(arr2) / sizeof(arr2[0]));
Vector v1(vec1);
Vector v2(vec2);
std::cout << "\n Case 1: \n";
Vector v3 = v1 + vec2;
std::cout << "\n Case 2: \n";
Vector v4 = v1 + v2;
// program is paused here, so remaining destructors don't show in output
}
Вывод:
2nd ctor
2nd ctor
Case 1:
2nd ctor
2nd ctor
dtor
Case 2:
2nd ctor
Прежде всего позвольте мне отметить, что есть причина, по которой стандартная библиотека не имеет operator+
для vector
: она не интуитивно понятна, что она должна делать. Должен ли он добавить два вектора? Добавьте соответствующие элементы? Секретный вариант 3? Даже если это "очевидно" для вас, это не будет очевидно для людей, которые должны поддерживать ваш код в будущем. Гораздо лучший подход - это просто называемые методы или бесплатные функции.
Тем не менее, причина, по которой вы получаете дополнительные вызовы ctor2 и dtor в случае 1, состоит в том, что во-первых, ваш параметр является std::vector
но вашему оператору требуется Vector
поэтому единственный способ вызвать +
- преобразовать std::vector
в Vector
. Затем внутри оператора вы создаете std::vector
чтобы заполнить результат, но возвращаемый тип оператора Vector
поэтому результат должен быть преобразован в оператор return
.
Для случая 2 вы видите дополнительный ctor2 для той же причины return
что и в случае 1.