c – 重载“”运算符,结果错误?

c – 重载“”运算符,结果错误?,第1张

概述我有一个自定义类,旨在为二维数组服务.我已经超载了 *** 作符,但我得到了一些我没想到的奇怪结果.我在这里有副本和赋值构造函数: Array<T, ROW, COL>& operator=(const Array<T, ROW, COL> &rhs) { if (this != &rhs) { // allocate new memory T *newData = 我有一个自定义类,旨在为二维数组服务.我已经超载了 *** 作符,但我得到了一些我没想到的奇怪结果.我在这里有副本和赋值构造函数:

Array<T,ROW,Col>& operator=(const Array<T,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,Col> &operator+(const Array<T,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;}

这是一段主要内容:

Array<double,10> ten;ten.fill(10.0); // fill with tensArray<double,10> result = ten + ten + ten + ten;std::cout << result << std::endl;

Yeilds:

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

这对我没有意义.我认为结果将是40.如果您需要查看它们,我会定义复制和赋值构造函数.

我不明白的是什么?谢谢!

解决方法 不要,只是不要.运算符不应修改其任一 *** 作数的内部状态.正确的原型将是

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

正如您所看到的,您按值返回并且不修改任何原始参数(第一个按值传递,但是因为您要创建它的副本或函数内的新对象以返回它,传递它值也一样好 – 或者你可以通过const引用传递它.如果你必须保留它作为成员(我写的那个是自由运算符),将其原型化为

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

请注意const限定符,它告诉您(和读者)不修改它.

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

@H_403_57@ 总结

以上是内存溢出为你收集整理的c – 重载“”运算符,结果错误?全部内容,希望文章能够帮你解决c – 重载“”运算符,结果错误?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1221072.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存