我试图重新定义+运算符,它是对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;
}
答案 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
的范围内。只需input
和print
即可。