<실행 결과>
3.14
3.14
3.14
2826
2826
#include <iostream>
using namespace std;
class Circle {
int radius;
public:
Cicle() {radius = 1;};
Circle(int r) {radius = r;};
double getArea();
};
double Circle::getArea() {
return 3.14*radius*radius;
}
int main() {
Circle donut;
Circle pizza(30);
cout<< donut.getArea()<< endl;
Circle *p;
p = &donut;
cout << p->getArea() << endl;
// (*p).getArea() = donut.getArea()
p = &pizza;
cout << p->getArea() << endl; // =pizza.getArea()
}
<실행 결과>
Circle 0의 면적은 314
Circle 1의 면적은 1256
Circle 2의 면적은 2826
Circle 0의 면적은 314
Circle 1의 면적은 1256
Circle 2의 면적은 2826
#include <iostream>
using namespace std;
class Circle {
int radius;
public:
Cicle() {radius = 1;};
Circle(int r) {radius = r;};
double getArea();
setRadius(int r) {radius = r;};
};
double Circle::getArea() {
return 3.14*radius*radius;
}
int main() {
Circle array[3];
Circle *p;
*p = array;
for(int i=0; i < n; i++) {
array[i].setRadius(10*(i+1));
}
for(int i=0; i < n; i++) {
cout << "cout << "Circle " << i << "의 면적은 " << array[i] << endl;
}
for(int i=0; i < n; i++) {
cout << "Circle " << i << "의 면적은 " << p[i]->getArea();
p++;
}
}
<객체 포인터를 사용하여 객체 배열을 다루는 다양한 사례>
객체 포인터를 이용하여 circleArray의 각 Circle 객체을 출력하는 코드를 다양하게 작성할 수 있다.
(1) 포인터 p를 이용하여 객체처럼 접근
Circle *p = circleArray;
for(int i=0; i<3; i++)
cout << (*p).getArray() << endl; // (*p) == circleArray
(2) 배열의 이름 circleArray를 포인터로 사용
for(int i=0; i<3; i++)
cout << (circleArray+i)->getArray() << endl;
(3) 포인터 p의 정수 연산 이용
Circle *p = circleArray;
for(int i=0; i<3; i++)
cout << (p+i)->getArray() << endl;
<실행 결과>
Circle 0의 면적은 314
Circle 1의 면적은 1256
Circle 2의 면적은 3.14
#include <iostream>
using namespace std;
class Circle {
int radius;
public:
Circle() {radius = 1};
Circle(int r) {radius = r};
doble getRadius() {return 3.14*radius*radius;};
};
int main() {
Circle a[3] = {Circle(10), Circle(20), Circle()};
for(int i=0; i < 3; i++) {
cout << "Circle " << i << "의 면적은 " << a[i] << endl;
}
}
<실행 결과>
Circle [0,0]의 면적은 3.14
Circle [0,1]의 면적은 12.56
Circle [0,2]의 면적은 28.26
Circle [1,0]의 면적은 50.24
Circle [1,1]의 면적은 78.5
Circle [1,2]의 면적은 113.04
#include <iostream>
using namespace std;
class Circle {
int radius;
public:
Circle() {radius = 1};
Circle(int r) {radius = r};
doble getRadius() {return 3.14*radius*radius;};
};
int main() {
Circle a[2][3] = { {Circle(), Circle(2), Circle(3)},
{Circle(4), Circle(5), Circle(6)} };
for(int i=0; i<2; i++) {
for(int j=0; j<3; j++) {
cout << "Circle " << [i,j] << "의 면적은 " << a[i][j] << endl;
}
}
}
class Sample {
int a;
public:
Sample() { a = 100; cout << a < ' ' ; };
Sample(int x) { a = x; cout << a < ' ' ; };
Sample(int x, int y) { a = x*y; cout << a < ' ' ; };
int get() { return a; };
};
(1) Sample arr[3];이 실행될 때 출력되는 결과는?
100 100 100
(2) Sample arr2D[2][2] = { {Sample(2, 3), Sample(2, 4)}, {Sample(5), Sample()} };이 실행될 때 출력되는 결과는?
6 8 5 100
(3) 객체 포인터를 이용하여 (1)에서 선언된 arr의 모든 원소(a)의 합을 출력하는 for 문을 작성하라.
int sum = 0;
for (int i = 0; i < 3; i++) {
sum += arr[i].get();
}
cout << "arr 원소의 합은 " << sum << endl;
(4) (2)에서 선언된 arr2D 배열 이름을 이용하여 모든 원소(a)의 합을 출력하는 for 문을 작성하라.
int sum = 0;
for (int i = 0; i < 4; i++) {
int a = (arr2D+i)->get();
sum += a;
}
cout << "arr2D 원소의 합은 " << sum << endl;
데이터타입 *포인터변수 = new 데이터타입;
delete 포인터변수;
int *pInt = new int; // 포인터변수: pInt, 데이터타입: int/ int 타입의 정수 공간 할당
char *pChar = new char; // 포인터변수: pChar, 데이터타입: char/ char 타입의 문자 공간 할당
Circle *pCircle = new Circle(); // 포인터변수: pCircle, 데이터 타입: Circle()?/ Circle 클래스 타입의 객체 할당
delete pInt; // 할당받은 정수 공간 반환
delete pChar; // 할당받은 문자 공간 반환
delete pCircle; // 할당받은 객체 공간 반환
힙 메모리가 부족하면 new는 NULL을 리턴하므로, new의 리턴 값이 NULL인지 검사하는 것이 좋다. 다음은 int 타입의 정수 공간 한 개를 할당받고 사용한 후 반환하는 코드이다.
int *p = new int; // 힙으로부터 int 타입의 정수 공간 할당
if(!p) { // if(p==NULL)과 동일. p가 NULL이면
return; // 메모리 할당받기 실패
}
*p = 5; // 할당받은 정수 공간에 5 기록
int n = *p; // 할당받은 정수 공간에서 값 읽기, n = 5
delete p; // 할당받은 정수 공간 반환