-객체 배열의 동적 생성과 생성자
클래스이름*포인터변수=new 클래스이름 [배열크기];
다음 코드는 4개의 Circle 객체로 구성된 배열을 동적 생성하는 예이다.
Circle*pArray = new Circle[3]; //3개의 Circle 객체 배열의 동적 생성
-new를 이용하여 동적으로 배열을 생성할 때, 다음과 같이 매개 변수 있는 생성자를 직접 호출할 수는 없다.
Circle *pArray=new Circle[3](30); //구문 오류, 컴파일 오류
----------------------------------------------------------
아래와 같이 배열을 각 원소 객체로 초기화 할 수 있다.
Circle *pArray= new Circle[3] {Circle(1),Circle(2),Circle(3)};
-객체 배열의 사용
동적으로 생성된 객체 배열은 보통 객체 배열처럼 사용.
Circle *pArray=new Circle[3];
pArray[0].setRadius(10); // 배열의 첫 번째 객체의 setRadius() 멤버 함수 호출
pArray[1].setRadius(20);
pArray[2].setRadius(30);
for(int i-0; i<3; i++)
count << pArray[i].getArea(); //배열이 i 번째 객체의 getArea() 멤버 함수 호출
-배열의 반환과 소멸자
delete 연산자를 이용하여 동적으로 할당받은 배열을 반환하는 형식.
delete [] 포인터변수; // 포인터변수가 가리키는 배열을 반환한다.
Circle 배열의 동적 생성 및 반환
#include <iostream>
using namespace std;
class Circle{
int radius;
public:
Circle();
Circle(int r);
~Circle();
void setRadius(int r){radius=r;}
double getArea(){return 3.14*radius*radius;}
};
Circle::Circle(){
radius=1;
cout<<"생성자 실행 radius="<<radius<<endl;
}
Circle::Circle(int r){
radius= r;
cout << "생성자 실행 radius="<<radius<<endl;
}
Circle::~Circle(){
cout << "소멸자 실행 radius="<<radius<<endl;
}
int main(){
Circle *pArray= new Circle[3]; //객체 배열의 동적 생성
pArray->setRadius(10);
(pArray+1)->setRadius(20);
(pArray+2)->setRadius(30);
for(int i=0;i<3;i++){
cout << pArray[i].getArea()<<endl;
}
Circle *p= pArray; //포인터 p에 배열의 주소값 설정
for(int i=0; i<3; i++){
cout << p->getArea() <<endl;
p++; // 다음 원소의 주소로 증가
}
delete [] pArray; //객체 배열 반환
}
[생능 출판사, 명품 C++ 프로그래밍] p.182
동적으로 할당받은 메모리는 반드시 반환해야 하는가?
힙은 프로그램이 실행 중에 new를 이용해 동적으로 할당받아 사용할 수 있는 메모리이다. 할당 받은 후 필요 없게 된 메모리를 힙에 반환하지 않거나, 코딩 잘못으로 메모리 누수가 생기면, 힙에 메모리가 부족하여 할당받을 수 없게 되니 주의가 필요하다 . 다행스럽게도 프로그램 종료 시, 힙 전체가 운영체제에 의해 반환되므로 누수 메모리에 대한 걱정은 하지 않아도 된다.
'Programming Language > C++' 카테고리의 다른 글
| string 클래스 개요 (0) | 2023.04.07 |
|---|---|
| this의 기본 개념 (0) | 2023.04.07 |
| C++ 동적 메모리 할당 및 반환 (0) | 2023.04.06 |
| 객체 배열 (0) | 2023.04.06 |
| C++ 객체 포인터와 객체 배열, 객체의 동적 생성 (0) | 2023.04.06 |