设计一个二维矩阵类 ,成员变量为double*类型,用来存储矩阵中的元素 ,写出赋值运算符重载(包括+=,-=,*=),拷贝构造函数和构造函数,实现矩阵的转置操作
时间: 2024-03-22 15:42:11 浏览: 108
好的,以下是实现你所需的二维矩阵类的代码:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
class Matrix {
private:
double* data; // 存储矩阵元素的指针
int rows, cols; // 矩阵的行数和列数
// 用于检查下标是否越界
bool checkIndex(int row, int col) const {
return row >= 0 && row < rows && col >= 0 && col < cols;
}
public:
// 构造函数
Matrix(int rows, int cols) {
this->rows = rows;
this->cols = cols;
data = new double[rows * cols];
memset(data, 0, sizeof(double) * rows * cols); // 初始化为0
}
// 拷贝构造函数
Matrix(const Matrix& other) {
rows = other.rows;
cols = other.cols;
data = new double[rows * cols];
memcpy(data, other.data, sizeof(double) * rows * cols);
}
// 赋值运算符重载
Matrix& operator=(const Matrix& other) {
if (this != &other) {
rows = other.rows;
cols = other.cols;
delete[] data;
data = new double[rows * cols];
memcpy(data, other.data, sizeof(double) * rows * cols);
}
return *this;
}
// += 运算符重载
Matrix& operator+=(const Matrix& other) {
if (rows != other.rows || cols != other.cols) {
cerr << "Error: Matrix shape mismatch!" << endl;
return *this;
}
for (int i = 0; i < rows * cols; i++) {
data[i] += other.data[i];
}
return *this;
}
// -= 运算符重载
Matrix& operator-=(const Matrix& other) {
if (rows != other.rows || cols != other.cols) {
cerr << "Error: Matrix shape mismatch!" << endl;
return *this;
}
for (int i = 0; i < rows * cols; i++) {
data[i] -= other.data[i];
}
return *this;
}
// *= 运算符重载
Matrix& operator*=(const Matrix& other) {
if (cols != other.rows) {
cerr << "Error: Matrix shape mismatch!" << endl;
return *this;
}
Matrix temp(rows, other.cols);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < other.cols; j++) {
for (int k = 0; k < cols; k++) {
temp.data[i * temp.cols + j] += data[i * cols + k] * other.data[k * other.cols + j];
}
}
}
*this = temp;
return *this;
}
// 转置操作
Matrix transpose() const {
Matrix result(cols, rows);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
result.data[j * result.cols + i] = data[i * cols + j];
}
}
return result;
}
// 析构函数
~Matrix() {
delete[] data;
}
// 重载 () 运算符,用于访问矩阵元素
double& operator()(int row, int col) {
if (!checkIndex(row, col)) {
cerr << "Error: Index out of range!" << endl;
}
return data[row * cols + col];
}
// 重载 () 运算符,用于访问矩阵元素(const版本)
const double& operator()(int row, int col) const {
if (!checkIndex(row, col)) {
cerr << "Error: Index out of range!" << endl;
}
return data[row * cols + col];
}
// 输出矩阵
friend ostream& operator<<(ostream& os, const Matrix& m) {
for (int i = 0; i < m.rows; i++) {
for (int j = 0; j < m.cols; j++) {
os << m(i, j) << " ";
}
os << endl;
}
return os;
}
};
```
在上面的代码中:
1. `Matrix` 类有一个指向 `double` 类型的数组 `data`,用于存储矩阵的元素。
2. `rows` 和 `cols` 分别是矩阵的行数和列数。
3. `checkIndex` 函数用于检查下标是否越界。
4. 构造函数用于创建一个指定行数和列数的矩阵,并将所有元素初始化为0。
5. 拷贝构造函数用于创建一个和已有矩阵相同的新矩阵。
6. 赋值运算符重载用于将一个矩阵赋值给另一个矩阵。
7. `+=`、`-=` 和 `*=` 运算符重载分别用于矩阵的加、减和乘法。
8. `transpose` 函数用于将矩阵转置。
9. 析构函数用于释放内存。
10. `operator()` 运算符重载用于访问矩阵中的元素。
11. `operator<<` 运算符重载用于输出矩阵。
希望这个类可以满足你的需求!
阅读全文