티스토리 뷰

IT/C++

[C++] 배열과 객체의 동적 할당

DongChul 2014. 10. 29. 15:29

1. 정적할당과 동적할당


정적할당이란 ?

C++에서 변수를 잡듯이 객체도 선언을 통해 이루어 진다. C에서 전역변수와 지역변수로 나누어는 것과 같이, 객체 역시 같은 방식으로 전역 또는 지역 객체로 선언할 수 있다.

전역 정적 객체는 main() 함수가 실행 되기 전 저장공간이 생성되고, 생성자가 호출된다. 객체가 생성되면 메모리에 데이터 저장공간이 생기고 바로 생성자가 호출된다. 따라서 전역 정적 객체 생성자의 호출은 main함수보다 먼저 이루어진다.

동적할당이란 ?

new에 의해 생성 되고, delete에 의해 삭제 된다. new로 생성 되면, new 실행 시점에서 객체의 저장공간인 메모리를 확보하고 생성자가 자동실행 된다. 동적객체는 힙영역에 존재하고 포인터를 넘겨 받아서 객체 포인터 변수에 주소값을 저장하고 처리한다.

'new'의 코딩은 함수에 넣을 수 밖에 없으므로 main 함수 시작 이후에야 가능하다.


2. 동적할당, 해제 방법


new 에 의해 생성되고 delete에 의해 해제된다

예를들면 

int *p = new int[5];


 delete [] p;

이런식이다.


3. 예제


cout<< " 입력할 정수의 개수는?";

    int n;

    cin >> n ;

    

    if(n<=0) return 0;

    

    int *p = new int[n];

    

    if(!p) cout<<"메모리를 할당할 수 없습니다.";

    for(int i =  0;i<n;i++){

            cin>>p[i];

            }

            

    int sum=0;

    for(int j=0;j<n;j++)

            sum += p[j];

    cout<<"평균 = " <<sum/n<<endl; 

            

    delete [] p;


동적할당을 받아 int 형 배열을 만들고 합의 평균을 구하는 예제이다 

delete로 할당받은 메모리를 해제한다.



4. 배열의 동적할당시 초기값, 해제시 유의사항

• 동적 할당 메모리 초기화

– 동적 할당 시 초기화

– 배열은 동적 할당 시 초기화 불가능

• delete시 [] 생략

– 컴파일 오류는 아니지만 비정상적인 반환


데이터타입 *포인터변수 = new 데이터타입(초깃값);

int *pInt = new int(20); // 20으로 초기화된 int 타입 할당

char *pChar = new char('a'); // ‘a’로 초기화된 char 타입 할당

int *pArray = new int [10](20); // 구문 오류. 컴파일 오류 발생

int *pArray = new int(20)[10]; // 구문 오류. 컴파일 오류 발생

int *p = new int [10];

delete p; // 비정상 반환. delete [] p;로 하여야 함.

int *q = new int;

delete [] q; // 비정상 반환. delete q;로 하여야 함.


5. 객체배열의 동적할당, 해제예제


객체배열의 동적할당은 아래와 같은 코드로 한다

동적할당과의 차이는 많이 없지만 할당과 동시에 초기화 할 수 없다는 차이점이 있다


Circle *pArray = new Circle[3];

pArray[0].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;

        for(int i = 0; i <3; i++){

                cout << p->getArea() << endl;

                p++;

        }

        

        delete [] pArray; 


6. this


this란 객체 자신에 대한 포인터이다.

this의 예제는 아래와 같다.

void setRadius(int radius){

    this->radius = radius;

}


일때  this가 가리키는것은 클래스에 선언되어있는 radius이고 this가 아닌것은 

매개변수로 받은 radius이다


this를 사용해야하는경우

* 매개변수의 이름과 멤버 변수의 이름이 같은경우


* 멤버 함수가 객체 자신의 주소를 리턴할 때

- 연산자 중복시 매우 필요하다.



'IT > C++' 카테고리의 다른 글

[C++] 함수의 인수 전달,복사 생성자  (0) 2014.11.07
[C++] String Class  (0) 2014.11.06
[C++] 계산기 예제  (0) 2014.10.08
[C++] 생성자 소멸자 응용 프로그램  (0) 2014.10.08
통장관리프로그램  (2) 2014.09.26
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함