2
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;
}

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

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

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

4

2 回答 2

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;

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

于 2012-11-13T11:47:19.763 回答
1

这种设计很快就会变得低效。想想当你这样做时会发生什么:

matrix D = A + B + C ;

模板元编程为您提供了一些非常好的可能性来避免制作无用的临时文件。犰狳是这个想法的一个很好的实现。

于 2012-11-13T11:55:56.547 回答