重新定义运算符c ++

时间:2013-04-11 12:02:27

标签: c++ class matrix operators

我试图重新定义+运算符,它是对2个矩阵求和并在c ++中返回求和矩阵。但不知何故,它一直显示0。我错过了什么?这是我的代码。 我也写了这段代码。

#include <iostream>
using namespace std;
class matrix{
    public:
        int a[100][100], n;
        matrix(int b[100][100], int n){
            for(int i=0; i<n; i++){
                for(int l=0; l<n; l++){
                    a[i][l]=b[i][l];
                }
            }
            n=n;
        }
        matrix(){}
        void matrix_input(int n){
            for(int i=0; i<n; i++){
                for(int l=0; l<n; l++){
                    cin >> a[i][l];
                }
            }
        }
        void matrix_print(int n){
            for(int i=0; i<n; i++){
                for(int l=0; l<n; l++){
                    cout << a[i][l] << " ";
                }
                cout << endl;
            }
        }


} ;
matrix operator + (matrix x, matrix y){
            int s;
            int n=x.n;
            matrix sum;
            for(int i=0; i<n; i++){
                for(int l=0; l<n; l++){
                    sum.a[i][l]=y.a[i][l]+x.a[i][l];

                }
            }
            return sum; 
}

int main(){
    int n;
    cin >> n;
    matrix o;
    o.matrix_input(n);
    matrix c;
    c.matrix_input(n);
    matrix sum;
    sum=o+c;
    sum.matrix_print(n);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

您的主要错误位于n=n行,这是一项自我指定。

正如你可以猜到的,当n是一个整数时(这应该是大部分时间),这几乎是一个无操作。你的意思是this->n = n;

(更好的方法是不要破坏命名,但小修补程序会起作用。你还需要修改operator +来分配sum.n = n;

本地n参数优先于类成员,因此您需要this->n来限定类成员。

顺便提一下,你的矩阵非常大(10,000英尺),因此复制起来很昂贵。因此,如果将operator+重载作为const引用,那么它将更有效。

大概n是一个逻辑大小,因为物理上你的矩阵总是100 * 100.你的默认构造函数至少应该将n初始化为0或者后续尝试读取这个矩阵的行为将是未定义的。在读取可能超出矩阵范围的内容时,您应该进行断言检查。 (您的运营商+可以检查两者是否具有相同的维度)。

如果你想使用&#34; dynamic&#34;调整大小,所以你只使用你将实际用于矩阵的内存资源,你会有点不同的实现它。我想这对你的水平来说是一个更高级的练习。

顺便说一句,&#34;始终打印0&#34;是随机的,因为您应该获得的行为实际上是未定义的,因为x.n(并且在添加中sum.n)是您正在阅读的未初始化的变量。

答案 1 :(得分:2)

在矩阵构造函数中,n = n将参数赋给自身。你可能意味着this->n = n;。但是,最好使用member-initialiser列表:

matrix(int b[100][100], int n) : n(n)
{
  for(int i=0; i<n; i++) {
    for(int l=0; l<n; l++) {
        a[i][l]=b[i][l];
    }
  }
}

而您的operator +未设置sum.n

<强>更新

matrix_input()也不会修改矩阵的n成员。换句话说,您的类不维护自己的不变量。在x.n内查询operator +是没有意义的。

您应该修改matrix,以使其成员n始终有效并反映矩阵中的内容。然后,您可以从n删除参数matrix_print()

顺便说一下,你为什么要打电话给你的会员职能matrix_something?它们已经在matrix的范围内。只需inputprint即可。