Tyl*_*eau 3 c++ templates operator-overloading operator-keyword
我有一个自定义类,旨在为二维数组服务.我已经超载了+
运营商,但我得到了一些我没想到的奇怪结果.我在这里有副本和赋值构造函数:
Array<T, ROW, COL>& operator=(const Array<T, ROW, COL> &rhs) {
if (this != &rhs) {
// allocate new memory
T *newData = new T[ROW * COL];
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
newData[j*ROW + i] = rhs(i, j);
}
}
data = newData;
}
return *this;
}
Run Code Online (Sandbox Code Playgroud)
这是我的重载+
运算符:
inline Array<T, ROW, COL> &operator+(const Array<T, ROW, COL> &rhs) {
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
this->data[j*ROW + i] += rhs(i,j);
}
}
return *this;
}
Run Code Online (Sandbox Code Playgroud)
这是一节main
:
Array<double, 10> ten;
ten.fill(10.0); // fill with tens
Array<double, 10> result = ten + ten + ten + ten;
std::cout << result << std::endl;
Run Code Online (Sandbox Code Playgroud)
Yeilds:
[0]: 80
[1]: 80
[2]: 80
[3]: 80
[4]: 80
[5]: 80
[6]: 80
[7]: 80
[8]: 80
[9]: 80
Run Code Online (Sandbox Code Playgroud)
这对我没有意义.我认为结果会40
一直存在.如果您需要查看它们,我会定义复制和赋值构造函数.
我不明白的是什么?谢谢!
Luc*_*ore 13
不要,只是不要.operator+
不应该修改其任何一个操作数的内部状态.正确的原型将是
Array<T, ROW, COL> operator+(Array<T, ROW, COL> lhs, const Array<T, ROW, COL> &rhs)
{
//logic goes here
return lhs;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,您按值返回并且不修改任何原始参数(第一个按值传递,但是因为您要创建它的副本或函数内的新对象以返回它,传递它价值也一样好 - 或者你可以通过const
参考传递它.如果你必须保留它作为成员(我写的那个是自由运算符),将其原型化为
Array<T, ROW, COL> Array::operator+(const Array<T, ROW, COL> &rhs) const;
Run Code Online (Sandbox Code Playgroud)
请注意const
限定符,它告诉您(和读者)this
未修改.
编辑:好的,终于找到了链接 - 阅读本文