c – 重载“”运算符,结果错误?
发布时间:2020-12-16 10:33:41 所属栏目:百科 来源:网络整理
导读:我有一个自定义类,旨在为二维数组服务.我已经超载了操作符,但我得到了一些我没想到的奇怪结果.我在这里有副本和赋值构造函数: ArrayT,ROW,COL operator=(const ArrayT,COL rhs) { if (this != rhs) { // allocate new memory T *newData = new T[ROW * COL]
我有一个自定义类,旨在为二维数组服务.我已经超载了操作符,但我得到了一些我没想到的奇怪结果.我在这里有副本和赋值构造函数:
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 tens Array<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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ruby-on-rails – 带有绑定的Ruby to_proc hack
- C#中foreach语句使用break暂停遍历的方法
- objective-c – 为什么我的xcode跳转到汇编视图?
- 常用正则表达式大全!(例如:匹配中文、匹配html)
- Flex中label换行
- 在安装ruby 1.9.2和1.9.3的win7上无法安装gem ruby??-debug
- swift 快速奔跑的兔几 本节的内容是:SceneKit COLLADA文件
- 仿百度文库方案[openoffice.org 3+swftools+flexpaper] 转换
- iphone – 恢复自动续订订阅的订阅购买
- Gtk-Critical **:gtk_widget_show断言GTK_IS_WIDGET(WIDGE