c++/클래스의 완성

[C++] 객체 배열과 포인터 배열

TIM_0529 2023. 1. 2. 04:44
반응형

객체 기반의 배열 선언은 다음과 같다.

Person arr[10];

이를 동적으로 할당하는 경우에는 다음의 형태로 선언한다.

Person *ptrArr = new Person[10];

이렇게 배열을 선언한 경우에도 생성자는 호출이 된다. 하지만 선언 과정에서 호출할 생성자를 별도로 명시하지 못한다. 즉, 생성자에 인자값을 전달하지 못한다.

배열에 선언과정에서 각가의 요소를 원하는 값으로 초기화시키길 원한다면, 일일이 초기화 과정을 별도로 해줘야 한다.

#include <iostream>
#include <cstring>
#pragma warning(disable:4996)
using namespace std;

class Person {
	char* name;
	int age;

public:
	Person()
	{
		name = NULL;
		age = 0;
		cout << "Called Person Constructor" << endl;
	}
	Person(char* my_name, int my_age)
	{
		int len = strlen(my_name) + 1;
		name = new char[len];
		strcpy(name, my_name);
		age = my_age;
	}
	void SetPersonInfo(char* my_name, int my_age)
	{
		name = my_name;
		age = my_age;
	}
	void ShowPersonInfo()
	{
		cout << "Name: " << name << endl;
		cout << "Age: " << age << endl;
	}
	~Person()
	{
		delete []name;
		cout << "Called destructor" << endl;
	}
};

int main()
{
	Person parr[2];
	char name[10];
	char* strptr;
	int age;
	int len;
	for (int i = 0; i < 2; i++)
	{
		cout << "Name: ";
		cin >> name;
		cout << "Age: ";
		cin >> age;
		len = strlen(name) + 1;
		strptr = new char[len];
		strcpy(strptr, name);
		parr[i].SetPersonInfo(strptr,age);
	}
	parr[0].ShowPersonInfo();
	parr[1].ShowPersonInfo();

}

객체를 초기화 하기 위해서 이름과 나이르 받아온 후 동적할당을 for문 안에서 해주고 있다.

하지만 객체를 포인터 배열로 선언하면 다음과 같이 변경할 수 있다.

 

#include <iostream>
#include <cstring>
#pragma warning(disable:4996)
using namespace std;

class Person {
	char* name;
	int age;

public:
	Person()
	{
		name = NULL;
		age = 0;
		cout << "Called Empty Person Constructor" << endl;
	}
	Person(char* my_name, int my_age)
	{
		int len = strlen(my_name) + 1;
		name = new char[len];
		strcpy(name, my_name);
		age = my_age;
	}
	void SetPersonInfo(char* my_name, int my_age)
	{
		name = my_name;
		age = my_age;
	}
	void ShowPersonInfo()
	{
		cout << "Name: " << name << endl;
		cout << "Age: " << age << endl;
	}
	~Person()
	{
		delete []name;
		cout << "Called destructor" << endl;
	}
};

int main()
{
	Person *parr[3];
	char name[10];
	int age;
	for (int i = 0; i < 2; i++)
	{
		cout << "Name: ";
		cin >> name;
		cout << "Age: ";
		cin >> age;
		parr[i] = new Person(name, age);
	}
	parr[0]->ShowPersonInfo();
	parr[1]->ShowPersonInfo();
	delete parr[0];
	delete parr[1];

}

동적으로 객체 생성시 반드시 delete를 선언해서 할당을 해 줘야 한다.

저장의 대상을 객체로 하느냐, 객체의 주소 값으로 하느냐에 따라 다르게 로직을 구성할 수 있다.

 

반응형

'c++ > 클래스의 완성' 카테고리의 다른 글

[C++] 멤버 이니셜라이져 (Member Initializer)  (0) 2023.01.01
[C++] 생성자 (Constructor)  (0) 2023.01.01