【发布时间】:2013-11-09 21:41:35
【问题描述】:
我正在尝试使用运算符重载执行基本矩阵运算的程序。下面是我的代码:-
保存矩阵的类
class matrix {
int r, c;
int *data;
public :
matrix() //default contstructor
{
r=0; c=0;
data = NULL;
}
matrix(int a, int b) //general matrix constructor.
{
r = a; c = b;
data = new int[sizeof(int) * r * c];;
}
//Overloading + operator.
matrix operator +(matrix & M);
//Overloading = operator.
void operator =(matrix & M);
};
然后我创建了一个临时全局对象,如下所示。
matrix temp;
我已经重载了 + 运算符,如下所示。请注意,我必须使用上面创建的全局对象“temp”来保存并返回结果矩阵,因为我的数据成员是 int* 并且我无法返回具有本地范围的对象。
// Addition of matrix
matrix matrix :: operator+(matrix & M)
{
if(M.r != r || M.c != c) {
cout<<"Addition is not possible!";
return temp;
}
temp.r = r;
temp.c = c;
temp.data = new int(sizeof(int) * r * c);
for(int i=0; i<r; i++)
for(int j=0; j<c; j++)
*(temp.data +(i*c +j)) = *(data +(i*c +j)) + *(M.data +(i*c +j));
return temp;
}
好的,该程序运行良好...但我的问题是是否有任何有效的替代这个外部“临时”对象?
【问题讨论】:
-
temp副本极有可能被省略,因此您应该担心的唯一低效问题是当您有诸如m0 + m1 + m2 + m2之类的表达式时,其中mi都是矩阵。一个常见的解决方案是expression templates,但这很棘手。 -
除此之外:你的操作符应该是
const,并作用于const引用:matrix operator +(const matrix & M) const;,你的数组的大小看起来很可疑。 -
为什么要将临时对象声明为全局对象?只需在函数内将其声明为局部变量即可。
-
@JoachimPileborg 所说的。我所说的复制省略假设
temp是运算符中的局部变量。 -
将行和列参数作为模板参数是很常见的。例如。
Matrix<4, 4>。这使得将Matrix<4,4>添加到Matrix<3,3>成为编译时错误。
标签: c++ oop operator-overloading dynamic-memory-allocation