用于矩阵的C ++重载运算符

时间:2012-11-13 11:44:00

标签: c++ operator-overloading

class matrix
{
    int n;
    double **a;  //the "matrix"
public:
    matrix(int);
    ~matrix();
    int getN();
    matrix& operator=(matrix&);
    double& operator()(int,int);
    friend matrix& operator+(matrix,matrix);
    friend matrix& operator-(matrix,matrix);
    friend matrix& operator*(matrix,matrix);
    friend ostream& operator<<(ostream &,const matrix &);
};

matrix& operator+(matrix A,matrix B)
{
    int i,j,n=A.getN();
    assert(A.getN()==B.getN());
    matrix *C=new matrix(A.getN());
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            (*C)(i,j)=A(i,j)+B(i,j);
        }
    }
    return *C;
}

这是重载算术运算符的正确方法吗?

我的代码中是否有内存泄漏?

构造函数在堆中分配内存,首先为 double 指针数组,然后为每个指针分配一个 double 数组。

2 个答案:

答案 0 :(得分:6)

你应该按值返回新矩阵,并通过const引用传递(至少一个)参数:

matrix operator+(const matrix& A, const matrix& B);

这意味着您不应在运营商的主体内动态分配它。

如果只调用公共成员方法或成员运算符,则无需将非成员运算符声明为friend

另请注意,通常的做法是将+=*=等作为成员运营商实施,然后按照以下方式实施非成员:

matrix operator+(matrix A, const matrix& B)
{
  return A+=B;
}

另外,您必须检查矩阵的尺寸是否正确。使用您的设计,只能在运行时执行此操作。另一种方法是通过制作矩阵类模板在编译时强制执行维度正确性:

template <typename T, size_t ROWS, size_t COLS> matrix;

权衡是不同维度的矩阵是不同的类型。

答案 1 :(得分:1)

这种设计很快就会效率低下。想想你做的事情:

matrix D = A + B + C ;

模板元编程为您提供了一些非常好的可能性,可以避免无用的临时工。 Armadillo是一个非常好的实现。