矩阵相乘(运算符重载)

1.题目概述

定义一个矩阵类MyMatrix,并且在类中进行运算符重定义,用*实现矩阵相乘。要求必须对运算符进行重载,如果用函数如multiply(matrix,matrix)去实现矩阵之间的运算一律记0分。

必须包含以下析构函数,其中n是矩阵的阶数,data是存放矩阵数据的二维动态数组:

MyMatrix::~MyMatrix() { // 释放空间 for (int i = 0; i < n; i++) { delete[] data[i]; } delete[] data; }

矩阵相乘的具体内容不在此赘述

2.代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#include <iostream>
using namespace std;

class MyMatrix
{
private:
int** data;
int my_n;
public:
MyMatrix()
{
my_n = 100;
data = new int* [100];
for (int i = 0; i < 100; i++)
{
data[i] = new int[100];
}
}
MyMatrix(int n, int** t)
{
my_n = n;
data = new int* [n];
for (int i = 0; i < n; i++)
{
data[i] = new int[n];
}

for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
data[i][j] = t[i][j];
}
}
}

MyMatrix(const MyMatrix& m)
{
my_n = m.my_n;
data = new int* [m.my_n];
for (int i = 0; i < m.my_n; i++)
{
data[i] = new int[m.my_n];
}

for (int i = 0; i < my_n; i++)
{
for (int j = 0; j < my_n; j++)
{
data[i][j] = m.data[i][j];
}
}

}

MyMatrix operator*(MyMatrix m)
{
int** arr = new int* [my_n];
for (int i = 0; i < my_n; i++)
{
arr[i] = new int[my_n];
}

for (int i = 0; i < my_n; i++)
{
for (int j = 0; j < my_n; j++)
{
int num = 0;
for (int k = 0; k < my_n; k++)
{
num += data[i][k] * m.data[k][j];
}
arr[i][j] = num;
}
}

MyMatrix res(my_n, arr);

for (int i = 0; i < my_n; i++)
{
delete[] arr[i];
}
delete[] arr;

return res;
}

MyMatrix& operator=(const MyMatrix& m) {
if (this == &m) return *this;

for (int i = 0; i < my_n; i++) {
delete[] data[i];
}
delete[] data;

my_n = m.my_n;
data = new int* [my_n];
for (int i = 0; i < my_n; i++) {
data[i] = new int[my_n];
for (int j = 0; j < my_n; j++) {
data[i][j] = m.data[i][j];
}
}

return *this;
}

~MyMatrix() {
for (int i = 0; i < my_n; i++)
{
delete[] data[i];
}
delete[] data;
}

void print()
{
for (int i = 0; i < my_n; i++)
{
cout << data[i][0];
for (int j = 1; j < my_n; j++)
{
cout<< " " << data[i][j] ;
}

if (i != my_n - 1) cout << endl;
}
}
};


int main()
{
int c;
int n;
cin >> c >> n;

int** arr = new int* [n];
for (int i = 0; i < n; i++)
{
arr[i] = new int[n];
}

MyMatrix** m = new MyMatrix*[c];



for (int i = 0; i < c; i++)
{
for (int j = 0; j < n; j++)
{
for (int k = 0; k < n; k++)
{
cin >> arr[j][k];
}
}
m[i] = new MyMatrix(n, arr);
}

MyMatrix res = *(m[0]);
for (int i = 1; i < c; i++) {
res = res * (*m[i]);
}

res.print();

for (int i = 0; i < n; i++)
{
delete[] arr[i];
}
delete[] arr;

for (int i = 0; i < c; i++) {
delete m[i];
}
delete[] m;

return 0;
}

重点:

1.主函数中,构造res时会调用拷贝构造函数,由于MyMatrix类中数据涉及到指针,所以要写深拷贝。

2.在做乘法时,res * (*m[i])会返回一个临时对象,这个对象将对res重新赋值,所以设计到赋值运算符的重载。