객체 배열과 생성자
객체 배열은 말 그대로 객체를 배열의 형태로 선언한 것이다.
#include <iostream>
using std::cout;
using std::endl;
class Point {
int x;
int y;
public:
Point() {
cout << "Point() call!" << endl;
x = y = 0;
}
Point(int _x, int _y) {
x = _x;
y = _y;
}
int GetX() { return x; }
int GetY() { return y; }
void SetX(int _x) { x = _x; }
void SetY(int _y) { y = _y; }
};
int main() {
Point arr[5];
for (int i = 0; i < 5; i++) {
arr[i].SetX(i * 2);
arr[i].SetY(i * 3);
}
for (int j = 0; j < 5; j++) {
cout << "x: " << arr[j].GetX() << ' ';
cout << "y: " << arr[j].GetY() <<endl;
}
return 0;
}
25: 배열 안에 객체가 존재하게 된다.
객체 포인터 배열
객체 포인터 배열이란, 객체를 가리킬 수 있는 포인터로 구성이 되어 있는 배열이다.
#include <iostream>
using std::cout;
using std::endl;
class Point {
int x;
int y;
public:
Point() {
cout << "Point() call!" << endl;
x = y = 0;
}
Point(int _x, int _y) {
x = _x;
y = _y;
}
int GetX() { return x; }
int GetY() { return y; }
void SetX(int _x) { x = _x; }
void SetY(int _y) { y = _y; }
};
int main() {
Point* arr[5];
for (int i = 0; i < 5; i++) {
arr[i] = new Point(i * 2, i * 3); //new에 의한 객체 동적 생성
}
for (int j = 0; j < 5; j++) {
cout << "x: " << arr[j]->GetX() << ' ';
cout << "y: " << arr[j]->GetY() <<endl;
}
for (int k = 0; k < 5; k++) {
delete arr[k]; //arr[k]가 가리키는 객체 소멸
}
return 0;
}
25: 포인터 배열을 선언하고 있다(배열 포인터가 아니다). 따라서 Point 객체 5개를 가리킬 수 있는 배열이 생성된다.
27~29: 총 5개의 객체를 생성해서 그 주소 값을 포인터 배열 arr에 저장하고 있다.
28: i*2와 i*3을 인자로 받을 수 있는 Point 클래스의 생성자를 호출하면서, Point 객체를 생성해라. 힙 영역에 생성이 될 것이고 생성된 객체의 주소 값이 Point*(Point 클래스의 포인터)형으로 반환될 것이다.
35: 배열이 저장하고 있는 포인터가 가리키는 대상을 소멸시키는 것이다. 이렇게 delete 키어드에 의해서 객체가 소멸되더라도, 소멸자는 항상 호출이 된다.
malloc 함수로도 메모리 동적 할당은 가능하다. 하지만 malloc 함수는 객체의 크기만큼 메모리 공간을 할당할 수는 있을지라도, 생성자 호출은 이뤄지지 않는다. C++에서 이야기하는 객체의 조건을 만족시키려면, 생성자의 호출은 반드시 이뤄져야 한다.
'컴퓨터' 카테고리의 다른 글
ofstream (0) | 2019.04.23 |
---|---|
4-6. friend 선언 (0) | 2019.04.11 |
4-2. 캡슐화(Encapsulation) (0) | 2019.04.09 |
4-1. 정보 은닉(Information Hiding) (0) | 2019.04.08 |
3-4 멤버 함수의 외부 정의 (0) | 2019.04.07 |