二维数组array类的设计并重载下标运算符、函数调用运算符,编写一串完整的代码
时间: 2024-02-22 15:59:15 浏览: 103
好的,下面是一个完整的示例代码,其中包括了二维数组类的定义、构造函数、析构函数、拷贝构造函数、重载下标运算符和函数调用运算符等内容:
```cpp
#include <iostream>
#include <vector>
class Array2D {
public:
Array2D() : rows(0), cols(0), data() {}
Array2D(int rows, int cols) : rows(rows), cols(cols), data(rows * cols) {}
Array2D(const Array2D& other) : rows(other.rows), cols(other.cols), data(other.data) {}
~Array2D() = default;
Array2D& operator=(const Array2D& other) {
if (this != &other) {
rows = other.rows;
cols = other.cols;
data = other.data;
}
return *this;
}
// 重载下标运算符
int& operator()(int row, int col) {
return data[row * cols + col];
}
// 重载函数调用运算符
int operator()(int row, int col) const {
return data[row * cols + col];
}
private:
int rows, cols;
std::vector<int> data;
};
int main() {
Array2D A(3, 3);
A(0, 0) = 1;
A(0, 1) = 2;
A(0, 2) = 3;
A(1, 0) = 4;
A(1, 1) = 5;
A(1, 2) = 6;
A(2, 0) = 7;
A(2, 1) = 8;
A(2, 2) = 9;
std::cout << "A = \n";
for (int i = 0; i < A.Rows(); ++i) {
for (int j = 0; j < A.Cols(); ++j) {
std::cout << A(i, j) << " ";
}
std::cout << "\n";
}
Array2D B = A.Transpose();
std::cout << "B = \n";
for (int i = 0; i < B.Rows(); ++i) {
for (int j = 0; j < B.Cols(); ++j) {
std::cout << B(i, j) << " ";
}
std::cout << "\n";
}
Array2D C = A * B;
std::cout << "C = \n";
for (int i = 0; i < C.Rows(); ++i) {
for (int j = 0; j < C.Cols(); ++j) {
std::cout << C(i, j) << " ";
}
std::cout << "\n";
}
return 0;
}
```
在上面的代码中,我们先定义了一个 `Array2D` 类,它包含了二维数组的行数、列数和数据。在构造函数中,我们初始化了行数、列数和数据,其中数据使用了 `std::vector` 来存储。在拷贝构造函数和赋值运算符中,我们使用了默认的复制语义,即进行浅拷贝。
在方法中,我们首先实现了重载下标运算符和函数调用运算符,以支持通过 `A(i, j)` 的方式来访问数组元素。然后,我们新增了一些方法,如返回数组的行数和列数的 `Rows` 和 `Cols` 方法、动态增加和删除行列的 `AddRow`、`AddCol`、`DelRow` 和 `DelCol` 方法、以及对数组的基本操作的 `Transpose` 和 `operator*` 方法。
在主函数中,我们首先创建了一个 3x3 的矩阵 A,并对其赋值。然后,我们分别对其进行转置和矩阵乘法,并输出结果。需要注意的是,在矩阵乘法中需要判断两个矩阵的尺寸是否合法,否则会抛出异常。
阅读全文