C에서와 같이, int형 2차원 배열이라면 int*형 1차원 배열로 취급한 뒤 각 칸의 값이 int형 배열의 시작 주소인 포인터 배열로 보기로 했다.
#include <iostream>
using namespace std;
int main()
{
int **arr;
int m, n;
cout << "number of column:";
cin >> m;
cout << "number of row:";
cin >> n;
arr = new int *[m];
for (int i = 0; i < m; i++)
{
arr[i] = new int[n];
for (int j = 0; j < n; j++)
arr[i][j] = i * n + j + 1;
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
cout << arr[i][j] << " ";
cout << endl;
}
for (int i = 0; i < m; i++)
delete[] arr[i];
delete[] arr;
arr = '\0';
return 0;
}
행(m),열(n) 수를 입력받아 그 크기의 2차원 배열을 만들고, 제일 왼쪽 위 칸부터 1~m*n까지 자연수를 하나씩 넣었다.
shallow copy얕은 복사는 포인터가 아닌 단순한 멤버 변수의 값만 제대로 복사하는 것.
deep copy깊은 복사는 포인터, 그리고 동적 메모리를 가리키는 포인터와 그 메모리의 내용도 모두 제대로 복사하며, 복사 과정에서 각 class가 다른 메모리를 가리키게 한다.
" The Big Three " 개념..
C++에서 대입연산자, 복사 생성자, 소멸자 를 묶어 말하는 용어로, 이들은 정의하지 않으면 자동으로 기본 정의 되지만, 멤버 중 포인터 등이 존재하면 우리가 직접 맞는 내용으로 정의할 필요가 있다.
class가 멤버 변수로 동적 배열을 가진 경우,
생성자에 크기를 넣어 배열의 크기를 정해 줘야 한다.
class MyClass{
private:
int nSize;
int *arr;
public:
MyClass();
MyClass(int*, int);
MyClass(MyClass&);
~MyClass();
int getSize();
int getNum(int);
void print();
MyClass& operator =(const MyClass&);
};