본문 바로가기
Language&Framework&Etc/C++

클래스의 완성(04-4) 클래스와 배열 그리고 this 포인터

by 머리올리자 2021. 1. 10.

객체 배열

Sosimple arr[10];
Sosimple *ptrArr = new Sosimple[10]; // 동적
  • 열 개의 객체가 모여 배열 구성
  • 배열의 선언과정에서는 호출할 생성자를 별도로 명시하지 못함
#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <cstring>
using namespace std;

class Person
{
private:
	char* name;
	int age;
public:
	Person()
	{
		name = NULL;
		age = 0;
		cout << "called Person()" << endl;
	}
	void setinfo(char* myname, int myage)
	{
		name = myname;
		age = myage;
	}

	void showinfo() const
	{
		cout << "이름 : " << name << ", ";
		cout << "나이 : " << age << endl;
	}
	~Person()
	{
		delete[]name;
		cout << "call destructor!" << endl;
	}
};

int main(void)
{
	Person parr[3]; // Person() 생성자 실행
	char namestr[100];
	char* strptr;
	int age;
	int len;

	for (int i = 0; i < 3; i++)
	{
		cout << "이름: ";
		cin >> namestr;
		cout << "나이: ";
		cin >> age;
		len = strlen(namestr) + 1;
		strptr = new char[len]; // 입력한 이름 + 1만큼 메모리 공간 할당
		strcpy(strptr, namestr); // 할당한 메모리 공간으로 입력한 이름 복사
		parr[i].setinfo(strptr, age); // 클래스에 정보 입력
	}

	parr[0].showinfo();
	parr[1].showinfo();
	parr[2].showinfo();

	return 0; // 소멸자 실행
}

객체 포인터 배열

객체의 주소 값 저장이 가능한 포인터 변수로 이뤄진 배열

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <cstring>
using namespace std;

class Person
{
private:
	char* name;
	int age;
public:
	Person(char * myname, int myage)
	{
		int len = strlen(myname) + 1;
		name = new char[len];
		strcpy(name, myname);
		age = myage;
	}
	void setinfo(char* myname, int myage)
	{
		name = myname;
		age = myage;
	}

	void showinfo() const
	{
		cout << "이름 : " << name << ", ";
		cout << "나이 : " << age << endl;
	}
	~Person()
	{
		delete[]name;
		cout << "call destructor!" << endl;
	}
};

int main(void)
{
	Person *parr[3]; // 포인터 배열
	char namestr[100];
	int age;

	for (int i = 0; i < 3; i++)
	{
		cout << "이름: ";
		cin >> namestr;
		cout << "나이: ";
		cin >> age;
		parr[i] = new Person(namestr, age);

	}

	parr[0] -> showinfo(); // 포인터로 구조체나 클래스 멤버에 접근할 때는 화살표 연산자 사용
	parr[1] -> showinfo();
	parr[2] -> showinfo();

	delete parr[0];
	delete parr[1];
	delete parr[2];

	return 0; // 소멸자 실행
}

배열에 일반 구조체가 있으면 점으로, 포인터가 있으면 화살표로 접근

this 포인터

  • 객체 자신을 가리키는 용도로 사용되는 포인터
  • this 포인터는 그 주소 값과 자료형이 정해져있지 않은 포인터
  • this 포인터를 이용해 생성자의 매개변수를 멤버변수로 대입할 수 있다.

Self-Reference의 반환

객체 자신을 참조할 수 있는 참조자

SelfRef