[ 동적할당 ]
1. 변수, 배열 동적할당
//변수
int *ptr = new int;
*ptr = 10;
//배열
int *ptr = new int[3];
for( int i = 0; i < 3; i++ )
{
prt2[i] = ( i + 1 )*10;
}
//문자열
char *ptr3 = new char[5];
strcpy_s(ptr3, strlen("test") + 1, "test");
5도 가능
2. 변수, 배열 동적할당된 공간 해제
delete ptr; //변수
delete [] ptr2; //배열
delete [] ptr3; //문자열
3. 객체 동적 생성
Circle *p = new Circle(10); //void형, 값 입력 모두 가능
p -> getArea();
(*p).getArea();
4. 객체 해제
delete p;
####
[실습1] 정수 반지름을 입력 받고 Circle 객체를 동적 생성하여 면적을 출력하라. 음수가 입력되면 프로그램 종료.
----
출력창
정수 반지름입력 (음수입력 종료) 5
원의 면적은 78.5
정수 반지름입력 (음수입력 종료) 9
원의 면적은 254.34
정수 반지름입력 (음수입력 종료) -3
코드
//정수 반지름을 입력 받고 Circle 객체를 동적 생성하여 면적을 출력하라. 음수가 입력되면 프로그램 종료.
#include <iostream>
using namespace std;
class Circle
{
int radius;
public:
Circle() { radius = 1; }
Circle(int r) { radius = r; }
void setRadius(int r) { radius = r; } //반지름 셋팅
double getArea() //원의 넓이 구하는 함수
{
return radius * radius * 3.14;
}
};
int main(void)
{
int radius;
Circle* p;
while (1)
{
cout << "정수의 반지름을 입력하세요. (음수 입력시 종료) : ";
cin >> radius;
if (radius < 0)
break;
p = new Circle(radius); //동적생성 반지름은 입력값
cout << "원의 면적은 : " << p->getArea() << endl;
delete p;
}
return 0;
}
####
자료형 * ptr = new 자료형;
int * ptr = new int;
char * ptr = new char;
int * ptr = new int[10];
for(int i = 0; i < 10; i++)
{
ptr3[i] = i;
}
Circle * ptr5 = new Circle;
Circle * ptr6 = new Circle[5];
1) 객체 포인터 tmp 생성
Circle * tmp = ptr6;
for(int i = 0; i < 5; i++)
{
tmp -> GetArea();
tmp++;
}
2) 객체 포인터 이용
for(int i = 0; i < 5; i++)
{
(ptr6+i) -> GetArea();
}
3) 배열처럼 사용
for(int i = 0; i < 5; i++)
ptr6[i].GetArea();
int * ptr4 = new char[20];
[ 객체 배열의 동적 생성 및 반환 ]
클래스이름* 포인터변수 = new 클래스이름[배열크기];
delete [] *포인터 변수; //포인터 변수가 가리키는 객체 배열을 반환
[ 동적할당 공간 해제 ]
delete ptr1;
delete ptr2;
delete [] ptr3;
delete [] ptr4;
####
[실습1] 생성하고자 하는 원의 개수를 입력받아서 갯수 만큼 객체 배열을 동적으로 생성하시오.
반지름을 입력받고, 각 원의 넓이를 계산해서 출력
원의 넓이가 100에서 200사이인 원의 갯수 출력
결과)
생성하고자 하는 원의 개수? 5
반지름을 입력하시오.
원1 : 5
원2 : 6
원3 : 10
원4 : 7
원5 : 8
78.5 113.04 314 153.86 200.96
면적이 100에서 200 사이인 원의 개수는 4
####
정수형 동적할당 코드
//정수 배열 동적할당
#include <iostream>
using namespace std;
int main(void)
{
//사이즈를 입력받아서 사이즈 만큼의 배열을 동적할당 후 저장 해제
int size = 0;
cout << "입력할 정수의 갯수는? ";
cin >> size;
//동적할당
int* ptr = new int[size];
int* p = ptr;
int sum = 0;
for (int i = 0; i < size; i++)
{
cout << i + 1 << "번째 정수 : ";
cin >> *p;
sum += *p;
p++;
}
double avg = sum / (double)size;
cout << "평균 : " << avg << endl;
delete[] ptr; //동적할당 해제
return 0;
}
문자열 배열의 동적 할당 코드
//문자열 배열의 동적 할당 및 반환
#include <iostream>
using namespace std;
class NameCard
{
//1. 생성자(동적할당)
//2. 소멸자(동적할당된 공간에서 해제해야 함)
char* name;
char* comp;
char* tel;
char* posi;
public:
NameCard(const char* _name, const char* _comp, const char* _tel, const char* _posi)
{
name = new char[strlen(_name) + 1];
comp = new char[strlen(_comp) + 1];
tel = new char[strlen(_tel) + 1];
posi = new char[strlen(_posi) + 1];
strcpy_s(name, strlen(_name) + 1, _name);
strcpy_s(comp, strlen(_comp) + 1, _comp);
strcpy_s(tel, strlen(_tel) + 1, _tel);
strcpy_s(posi, strlen(_posi) + 1, _posi);
}
void ShowNameCardInfo()
{
cout << "이름 : " << name << endl;
cout << "회사 : " << comp << endl;
cout << "전화번호 : " << tel << endl;
cout << "직급 : " << posi << endl << endl;
}
~NameCard() //소멸자
{
delete[] name;
delete[] comp;
delete[] tel;
delete[] posi;
}
};
//name, comp, tel, posi
int main(void)
{
NameCard manClerk("Lee", "ABCEng", "010-000-444", "clerk");
NameCard manSenior("Hong", "OrangeEng", "010-333-4444", "senior");
NameCard manAssist("Kim", "SoGoodComp", "010-555-6666", "assist");
manClerk.ShowNameCardInfo();
manSenior.ShowNameCardInfo();
manAssist.ShowNameCardInfo();
return 0;
}
정수형 배열의 동적할당 코드
#include <iostream>
using namespace std;
class Sample
{
int* p;
int size;
public:
Sample(int n)
{
size = n; p = new int[n];
}
void read(); //동적할당 받은 정수 배열 p에 사용자로부터 정수 입력받음
void write(); //정수 배열을 화면에 출력
int big(); //정수 배열에서 가장 큰 수 리턴
~Sample() //소멸자
{
delete p;
}
};
int main(void)
{
Sample s(10);
s.read();
s.write();
cout << "가장 큰 수는 " << s.big() << endl;
}
void Sample::read() //동적할당 받은 정수 배열 p에 사용자로부터 정수 입력받음
{
cout << "숫자 10개를 순서대로 입력하세요." << endl;
for (int i = 0; i < 10; i++)
{
cin >> p[i];
}
}
void Sample::write() //정수 배열을 화면에 출력
{
cout << endl;
for (int i = 0; i < 10; i++)
{
cout << p[i] << " ";
}
cout << endl << endl;
}
int Sample::big() //정수 배열에서 가장 큰 수 리턴
{
int bign = 0;
for (int i = 0; i < 10; i++)
{
if (bign < p[i])
bign = p[i];
}
return bign;
}
[ this : 자기참조 포인터 ]
- this가 필요한 경우 : 매개변수의 이름과 멤버 변수의 이름이 같은 경우
멤버 함수가 객체 자신의 주소를 리턴할 때(연산자 중복 시)
- this 제약사항 : 멤버 함수가 아닌 함수에서 사용 불가(전역변수), static에 사용 불가
포인터 동적할당 코드
#include <iostream>
using namespace std;
class Circle
{
int radius;
public:
Circle() { radius = 1; }
Circle(int radius) { this->radius = radius; }
void setRadius(int radius) { this->radius = radius; }
double getArea() { return 3.14 * radius * radius; }
};
int main(void)
{
int size, radius;
cout << "생성하고자 하는 원의 개수는? ";
cin >> size;
//원의 개수만큼 동적으로 객체 생성
Circle* pArray = new Circle[size];
//반지름을 입력받아서 각 객체 반지름 셋팅
cout << "반지름을 입력하시오." << endl;
for (int i = 0; i < size; i++)
{
cout << "원" << i + 1 << " : ";
cin >> radius;
pArray[i].setRadius(radius);
}
int count = 0; //넓이가 100이상 200이하인 원의 개수
double area;
//1) 객체포인터 tmp 생성 하는 방법
//Circle* tmp = pArray;
//for (int i = 0; i < size; i++)
//{
// area=tmp->getArea();
// cout << area << ' ';
// if (area >= 100 && area <= 200)
// {
// count++;
// }
// tmp++;
//}
//2) pArray 객체포인터 이용하는 방법
for (int i = 0; i < size; i++)
{
area = (pArray + i)->getArea();
if (area >= 100 && area <= 200)
{
count++;
}
}
//for (int i = 0; i < size; i++)
//{
// area = pArray[i].getArea();
// cout << area << ' ';
// if (area >= 100 && area <= 200)
// {
// count++;
// }
//}
cout << "면적이 100에서 200 사이의 원의 개수는 " << count << endl;
delete[] pArray;
return 0;
}