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 数组。
答案 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)