我为Vector
类重载了'+'运算符,如下所示。现在,在主程序中,我在两种情况下使用此运算符:
operator+
的第二个参数是std::vector
而不是Vector
个对象。我不明白为什么调用第二个构造函数或为什么调用析构函数,似乎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
答案 0 :(得分:1)
首先让我指出,标准库没有operator+
vector
是有原因的:它不直观它应该做什么。它应该附加两个向量吗?添加相应的元素?秘密选项3?即使它对您来说“显而易见”,对于将来必须维护您的代码的人来说也不会显而易见。更好的方法是简单命名方法或自由函数。
也就是说,你在案例1中获得额外的ctor2和dtor调用的原因是,首先,你的参数是std::vector
,但是你的运营商需要Vector
这样才能调用+
是将std::vector
转换为Vector
。然后在运算符内部创建std::vector
以填充结果,但运算符的返回类型为Vector
,因此必须再次在return
语句中转换结果。
对于案例2,您会看到额外的ctor2与案例1完全相同的return
理由。