gpt4 book ai didi

c++ - 重载 "+"运算符,结果错误?

转载 作者:太空狗 更新时间:2023-10-29 19:44:00 25 4
gpt4 key购买 nike

我有一个自定义类,旨在为二维数组提供服务。我已经重载了 + 运算符,但得到了一些我没有预料到的奇怪结果。我这里有复制和赋值构造函数:

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

这是我重载的 + 运算符:

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

这是 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;

产量:

[0]: 80 
[1]: 80
[2]: 80
[3]: 80
[4]: 80
[5]: 80
[6]: 80
[7]: 80
[8]: 80
[9]: 80

这对我来说没有意义。我认为结果一直都是 40。如果您需要查看它们,我已经定义了复制和赋值构造函数。

我不明白什么?谢谢!

最佳答案

不要,就是不要。 operator+ 不应修改其任一操作数的内部状态。正确的原型(prototype)应该是

Array<T, ROW, COL> operator+(Array<T, ROW, COL> lhs, const Array<T, ROW, COL> &rhs)
{
//logic goes here
return lhs;
}

如您所见,您按值返回并且没有修改任何原始参数(第一个参数按值传递,但由于您正在创建它的拷贝或新对象在返回它的函数内部,通过值传递它同样好——或者你可以通过 const 引用传递它)。如果一定要保留为成员(我写的是free operator),原型(prototype)为

Array<T, ROW, COL> Array::operator+(const Array<T, ROW, COL> &rhs) const;

注意 const 限定符,它告诉您(和读者)this 没有被修改。

编辑:好的,终于找到了链接 - 阅读 this

关于c++ - 重载 "+"运算符,结果错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16948459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com