用户定义的Vector类的自动类型转换?

时间:2013-12-26 17:49:39

标签: c++ vector type-conversion destructor

我为Vector类重载了'+'运算符,如下所示。现在,在主程序中,我在两种情况下使用此运算符:

  1. operator+的第二个参数是std::vector而不是Vector个对象。我不明白为什么调用第二个构造函数或为什么调用析构函数,似乎std::vector被自动转换为Vector对象。

  2. operator+的第二个参数是Vector个对象。我不明白为什么调用第二个构造函数。

  3. 感谢。

    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
    

1 个答案:

答案 0 :(得分:1)

首先让我指出,标准库没有operator+ vector是有原因的:它直观它应该做什么。它应该附加两个向量吗?添加相应的元素?秘密选项3?即使它对您来说“显而易见”,对于将来必须维护您的代码的人来说也不会显而易见。更好的方法是简单命名方法或自由函数。

也就是说,你在案例1中获得额外的ctor2和dtor调用的原因是,首先,你的参数是std::vector,但是你的运营商需要Vector这样才能调用+是将std::vector转换为Vector。然后在运算符内部创建std::vector以填充结果,但运算符的返回类型为Vector,因此必须再次在return语句中转换结果。

对于案例2,您会看到额外的ctor2与案例1完全相同的return理由。