C++ c++;重载:运算符的重载=

C++ c++;重载:运算符的重载=,c++,pointers,operator-overloading,operators,C++,Pointers,Operator Overloading,Operators,我遇到了一些运算符为的重载问题。 我的代码是 #include <stdlib.h> #include <iostream> const std::size_t DIM = 10; template <typename T> class rowvec { private: T* m_pnt; std::size_t m_dim; public: rowvec(); rowvec(s

我遇到了一些运算符为的重载问题。 我的代码是

#include <stdlib.h>
#include <iostream>


const std::size_t DIM = 10;


template <typename T>

class rowvec
  {
    private:
      T* m_pnt;
      std::size_t m_dim;

    public:
      rowvec();
      rowvec(std::size_t);
      ~rowvec();

      rowvec<T>& operator=(const rowvec<T>& x);

      T* pnt();
  };


template <typename T>
rowvec<T>::rowvec()
  {
    m_dim = DIM;
    m_pnt = (T*) calloc (DIM ,sizeof(T));
  }


template <typename T>
rowvec<T>::rowvec(std::size_t n)
  {
    m_dim = n;
    m_pnt = (T*) calloc(m_dim,sizeof(T));
  }


template <typename T>
rowvec<T>::~rowvec()
      {free(m_pnt);}


template <typename T>
rowvec<T>& rowvec<T>::operator=(const rowvec<T> &x)
  {
    std::cout << "hello" << std::endl;
    if (this != &x)
      {
        free (m_pnt);
        this->m_dim=x.m_dim;
        m_pnt = (T*) calloc (m_dim,sizeof(T));
        for (int i=0; i!=m_dim; i++)
          *(m_pnt+i)=*(x.m_pnt+i);
      }
    return *this;
  }


template <typename T>
T* rowvec<T>::pnt()
  {return m_pnt;}  




int main()
  {
    rowvec<int> k(3);

    rowvec<int> c=k;

    std::cout << "ok" << std::endl;

    return 0;
  } 
如果我以这种方式更改代码:

int main()
  {
    rowvec<int> k(3);

    rowvec<int> c;

    c=k;

    std::cout << "ok" << std::endl;

    return 0;
  }

有没有一种方法可以允许像“rowvec c=k;”这样的声明?

即使其中有一个
=
rowvec c=k是复制初始化,使用复制构造函数而不是复制赋值运算符

因为您的类没有定义一个,所以使用了只执行memberwise复制的默认类。这只会复制指针,随后会导致双自由,因为
c
k
的析构函数都会在同一指针上调用
free()

给你的类一个合适的副本构造函数(制作一个深度副本),双重删除应该消失


也,你正在使用C++。不要使用

calloc
/
free
。使用
new
delete
即使其中有
=
rowvec c=k是复制初始化,使用复制构造函数而不是复制赋值运算符

因为您的类没有定义一个,所以使用了只执行memberwise复制的默认类。这只会复制指针,随后会导致双自由,因为
c
k
的析构函数都会在同一指针上调用
free()

给你的类一个合适的副本构造函数(制作一个深度副本),双重删除应该消失


也,你正在使用C++。不要使用

calloc
/
free
。使用
new
delete

您需要一个副本构造函数相关:可能重复使用向量,您不需要添加任何副本构造函数或赋值运算符。即使您修复了分配错误,您的类也会在尝试
rowvec
时爆炸。原因是您使用的是
calloc
,而
calloc
不构造对象。一般来说,C++程序中使用了<代码> C>代码>构造,而这些C构造不适用于非POD类型。U需要复制结构相关:使用向量的可能副本,并且不需要添加任何复制构造函数或赋值操作符。只要您尝试
rowvec
,就会爆炸。原因是您使用的是
calloc
,而
calloc
不构造对象。通常,在C++程序中使用<代码> C>代码>构造,而这些C构造不适用于非POD类型。
int main()
  {
    rowvec<int> k(3);

    rowvec<int> c;

    c=k;

    std::cout << "ok" << std::endl;

    return 0;
  }
hello
hello
ok