c++写一个矩阵类CMatrix,并运用模板技术,基本要求如下:1.实现构造,拷贝构造与析构函数2.支持任意大小的矩阵:行数和列数可以动态设置(不用修改代码)3.重载操作符*,实现矩阵相乘4.重载操作符=实现矩阵赋值5.重载操作符++和--,分别实现矩阵元素同时+1和-1
时间: 2024-03-07 11:46:48 浏览: 94
好的,这是一个比较复杂的问题,我会尽力回答。以下是我的代码实现:
```c++
template<typename T>
class CMatrix {
private:
int row;
int col;
T** data;
public:
CMatrix(int r, int c) {
row = r;
col = c;
data = new T*[row];
for(int i = 0; i < row; i++) {
data[i] = new T[col];
memset(data[i], 0, col * sizeof(T));
}
}
CMatrix(const CMatrix<T>& other) {
row = other.row;
col = other.col;
data = new T*[row];
for(int i = 0; i < row; i++) {
data[i] = new T[col];
memcpy(data[i], other.data[i], col * sizeof(T));
}
}
~CMatrix() {
for(int i = 0; i < row; i++) {
delete[] data[i];
}
delete[] data;
}
CMatrix<T>& operator=(const CMatrix<T>& other) {
if(this != &other) {
for(int i = 0; i < row; i++) {
delete[] data[i];
}
delete[] data;
row = other.row;
col = other.col;
data = new T*[row];
for(int i = 0; i < row; i++) {
data[i] = new T[col];
memcpy(data[i], other.data[i], col * sizeof(T));
}
}
return *this;
}
CMatrix<T> operator*(const CMatrix<T>& other) {
if(col != other.row) {
throw std::invalid_argument("The row of the first matrix is not equal to the column of the second matrix.");
}
CMatrix<T> result(row, other.col);
for(int i = 0; i < row; i++) {
for(int j = 0; j < other.col; j++) {
for(int k = 0; k < col; k++) {
result.data[i][j] += data[i][k] * other.data[k][j];
}
}
}
return result;
}
CMatrix<T>& operator++() {
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
data[i][j]++;
}
}
return *this;
}
CMatrix<T>& operator--() {
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
data[i][j]--;
}
}
return *this;
}
};
```
这个类实现了构造,拷贝构造和析构函数,支持任意大小的矩阵,重载了操作符*,=,++和--。其中,操作符*用于矩阵相乘,操作符=用于矩阵赋值,操作符++和--用于矩阵元素同时+1和-1。这个类使用了模板技术,可以处理任意类型的矩阵元素。
使用这个类的示例代码如下:
```c++
CMatrix<int> mat1(2, 3);
CMatrix<int> mat2(3, 2);
mat1 = {{1, 2, 3}, {4, 5, 6}};
mat2 = {{1, 2}, {3, 4}, {5, 6}};
CMatrix<int> mat3 = mat1 * mat2;
++mat3;
--mat3;
```
这个示例代码定义了两个矩阵mat1和mat2,分别是2行3列和3行2列的矩阵。然后,使用赋值操作符将mat1和mat2分别初始化为{{1, 2, 3}, {4, 5, 6}}和{{1, 2}, {3, 4}, {5, 6}}。接着,使用操作符*计算mat1和mat2的乘积,并将结果保存在mat3中。最后,使用操作符++和--将mat3中的所有元素同时+1和-1。
阅读全文