728x90
Circle *donut = new Circle;
Circle *pizza = new Circle(30);

delete donut;
delete pizza;

다음과 같이 객체 멤버를 동적 생성 및 반환할 수 있다.

 

Circle *pArray = new Circle[3]{Circle(1),Circle(2),Circle(3)};

delete [] pArray;

객체 배열은 다음과 같이 생성 및 반환한다.

 

728x90
728x90

c언어에서는 malloc과 free로 동적 메모리를 할당, 해제 했지만 c++에서는 new와 delete로 할당 해제가 가능하다.

 

기본 형식

int *pInt = new int(초기값);
char *pChar = new char(초기값);
Circle *pCircle = new Circle();

delete pInt;
delete pChar;
delete pCircle;

다음 코드처럼 동적 할당할 변수는 포인터로 관리한다.  할당 해제는 관리하는 포인터를 제거하면 된다.

 

배열도 동적 할당 및 반환이 가능하다.

int *pArray = new int [10] {초기값};
delete [] pArray;

다만, 포인터를 제거할때 배열이므로 []를 붙여주자.

 

//동적할당할때 포인터를 제거하면 메모리만 반환되고 실제 포인터값은 살아있다

728x90
728x90

객체 멤버를 배열로 생성한 예제

#include <iostream>
using namespace std;

class Circle {
	int radius;
public:
	Circle() { radius = 1; } // 배열을 만들기 위한 기본 생성자
	Circle(int r) { radius = r; } // 매개변수를 받는 기본 생성자
	void setRadius(int r) { radius = r; } // 변수 radius를 수정하기 위한 함수
	double getArea(); //넓이를 구하기 위한 함수
};

double Circle::getArea() {
	return 3.14 * radius * radius; // getArea함수 정의
}

int main() {
	Circle circleArray[3]; //객체 Circle의 멤버를 배열로 생성

	circleArray[0].setRadius(10);// 객체 Circle의 멤버 circleArray의 첫 번째 구성원에 setRadius함수 실행
	circleArray[1].setRadius(20);// " 두 번째 구성원
	circleArray[2].setRadius(30);// " 세 번째 구성원

	for (int i = 0; i < 3; i++)
		cout << "Circle " << i << "의 면적은 " << circleArray[i].getArea() << endl; // 배열로 생성하면 각 멤버의 이름을 배열이름[순서]로 생각하면 된다. 멤버 이름으로 접근
	Circle* p;
	p = circleArray;
	for (int i = 0; i < 3; i++) {
		cout << "Circle " << i << "의 면적은" << p->getArea() << endl; // 객체 포인터로 접근, 포인터로 접근하므로 +1로 다음 멤버에 접근할 수 있다.
		p++;
	}
}

circleArray[3] = {Circle(10), Circle(20), Circle()}; 다음과 같이 원소 객체를 초기화 할 수 있다.

 

728x90
728x90

객체에 대한 포인터 변수로 객체의 멤버 변수를 읽고 쓰거나 멤버 함수를 호출할 수 있다.

Circle donut; //객체 멤버 생성
double d = donut.getArea(); // d는 donut멤버의 getArea에 접근

Circle *p; // 객체에 대한 포인터 선언
p = &donut; // 포인터에 객체 멤버의 주소 저장
d = p->getArea(); // 객체 멤버를 getArea 함수에 넣음

#객체 이름으로 멤버에 접근할 때 >> . 연산자 (ex d = donut.getArea();)

#객체 포인터로 멤버에 접근할 때 >> -> 연산자 (ex d = p->getArea(); ||

d = (*p).getArea();

#멤버로 초기화되지 않은 객체 포인터를 사용하면 null pointer 에러

 

ex)

#include <iostream>
using namespace std;

class Circle { //객체 circle 생성
	int radius; // 인자 생성 (private)
public:
	Circle() { radius = 1; } //기본 생성자
	Circle(int r) { radius = r; } //매개변수를 받는 생성자
	double getArea(); //객체 함수
};

double Circle::getArea() {
	return 3.14 * radius * radius; //원의 넓이를 계산하여 리턴
}
int main() {
	Circle donut; //객체 멤버 'donut'생성
	Circle pizza(30);//객체 멤버 pizza 생성
	cout << donut.getArea() << endl; // 객체멤버 이름으로 함수 접근
	Circle* p;
	p = &donut;
	cout << p->getArea() << endl; // 객체 포인터로 함수 접근 
	cout << (*p).getArea() << endl; //다른 표현

	p = &pizza;
	cout << p->getArea() << endl;
	cout << (*p).getArea() << endl;
}
728x90

+ Recent posts