017 二维数组类
程序员文章站
2022-03-14 10:17:18
...
这题没有get到点的话还挺麻烦的。关键在于做一个数组指针的指针。
分析:
1⃣️ Array2 a(3,4); //构造函数,两int型参数,Array2是二维数组形式。
2⃣️ a[i][j] = i * 4 + j; //a[i][j] 在C++里相当于:a,operator[](i).operator[](j)
但是用上面说的数组指针的指针则不用这么麻烦,只需重载 “ [ ] ” 即可,详见code。
3⃣️ cout << a(i,j) << ","; //重载"()",常规操作。
4⃣️ b = a; //重载 "=",实现深拷贝。
5⃣️ 这题不用重载流输入符,因为在 cout<< 这边的都不是类成员变量,是一些类成员函数,在类成员函数里返回能输出的标准值即可。
6⃣️ 常规的复制构造函数(这题用不上,也写写,练手嘛)和析构函数。
完整代码如下:
#include <iostream>
#include <cstring>
using namespace std;
class Array2 {
// 在此处补充你的代码
private:
int ** p;//数组指针的指针,关键!
int col,row;
public:
//构造函数
Array2(int x = 0, int y = 0):col(x),row(y){
if( x && y == 0 ) p = NULL;
else{
p = new int*[col];
for(int i = 0; i < col; i++){
p[i] = new int[row];
}
}
}
//复制构造函数
Array2(const Array2 & array2_){
col = array2_.col;
row = array2_.row;
p = new int*[col];
for(int i = 0; i < col; i++){
p[i] = new int[row];
}
memcpy(p,array2_.p,sizeof(int) * col * row);
}
//重载"="实现深拷贝
Array2 & operator=(const Array2 & array2_){
if(p) delete []p;
col = array2_.col;
row = array2_.row;
p = new int*[col];
for(int i = 0; i < col; i++){
p[i] = new int[row];
}
memcpy(p,array2_.p,sizeof(int) * col * row);
return *this;
}
//析构函数
~Array2(){
if(p) delete []p;
}
//重载"[]"
int * operator[](int i){
return p[i];
//重载的是 a[][]的第一个[] ,因为返回的是p[x],则第二个[]相当于取p[x]的第y个。
}
//重载"()"
int & operator()(int x, int y){ //重载()
return p[x][y];
}
};
int main() {
Array2 a(3,4); //构造函数,两int型参数,Array2是二维数组形式。
int i,j;
for( i = 0;i < 3; ++i )
for( j = 0; j < 4; j ++ )
a[i][j] = i * 4 + j;
//a[i][j] 在C++里相当于:a,operator[](i).operator[](j)
for( i = 0;i < 3; ++i ) {
for( j = 0; j < 4; j ++ ) {
cout << a(i,j) << ","; //重载"()"
}
cout << endl;
}
cout << "next" << endl;
Array2 b;
b = a; //重载 "=",实现深拷贝。
for( i = 0;i < 3; ++i ) {
for( j = 0; j < 4; j ++ ) {
cout << b[i][j] << ",";
}
cout << endl;
}
return 0;
}