728x90
황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!
https://search.shopping.naver.com/book/catalog/32436115747
객체 포인터
- C++에서 객체를 다루기 위해 객체에 대한 포인터 변수를 선언하고, 이 포인터 변수로 객체의 멤버 변수를 읽고 값을 쓰거나 멤버 함수를 호출한다.
Circle donut;
double d = donut.getArea();
Circle* p; // 객체에 대한 포인터 변수 선언
p = &donut; // 포인터 변수에 객체 주소 지정
Circle* p = &donut // 포인터 변수 선언시 객체 주소로 초기화
d = donut.getArea(); // 객체 이름으로 멤버 함수 호출
d = p->getArea(); // 포인터로 객체 멤버 함수 호출
d = (*p).getArea(); // 아래와 같이 코딩 가능
- 위 그림과 코드는 Circle 객체에 대한 포인터 변수를 선언하고 활용하는 사례이다.
객체 배열
선언 및 활용
- 객체 배열은 원소가 객체라는 점을 빼고, int. char 등 기본 타입의 배열을 선언하고 활용하는 방법과 동일
#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();
};
double Circle::getArea() {
return 3.14*radius*radius;
}
int main() {
Circle circleArray[3]; // (1) Circle 객체 배열 생성
// 배열의 각 원소 객체의 멤버 접근
circleArray[0].setRadius(10); // (2)
circleArray[1].setRadius(20);
circleArray[2].setRadius(30);
for(int i=0; i<3; i++) // 배열의 각 원소 객체의 멤버 접근
cout << "Circle " << i << "의 면적은 " << circleArray[i].getArea() << endl;
Circle *p; // (3)
p = circleArray; // (4)
for(int i=0; i<3; i++) { // 객체 포인터로 배열 접근
cout << "Circle " << i << "의 면적은 " << p->getArea() << endl;
p++; // (5)
}
}
- 객체 배열 선언문은 기본 생성자를 호출한다. => 매개변수 없는 기본 생성자 호출
- Circle circleArray[3]; 선언문이 실행되면
- Circle::Circle() { radius = 1; } 3개의 Circle 객체가 생성되고, 각 객체마다 왼쪽의 기본 생성자가 호출된다.
사용
- 일반적으로 [] 연산자로 호출할 수 있다.
- 또한 Circle 클래스의 포인터를 이용하여 다룰 수 있다.
Circle *p; // (3)
p = circleArray; // (4) 배열의 첫번째 주소로 기록
for(int i=0; i<3; i++) { // 객체 포인터로 배열 접근
cout << "Circle " << i << "의 면적은 " << p->getArea() == (*p).getArea() << endl;
p++; // (5)
}
배열 소멸과 소멸자
- 함수가 종료하면 함수 내에 선언된 배열도 소멸
- 배열이 소멸되면, 모든 원소 객체가 소멸되며 각 원소 객체마다 소멸자가 호출
- main() 함수가 종료하면 circleArray 배열이 소멸되며, 높은 인덱스에서부터 원소 객체가 소멸
- 각 객체마다 ~Circle() 소멸자가 실행
Tip!!!
- 객체 포인터를 이용하여 circleArray의 각 Circle 객체의 면적을 출력하는 코드를 다양하게 작성할 수 있다.
// 포인터 p를 이용하여 객체처럼 접근
Circle* p = circleArray;
for (int i = 0; i < 3; i++)
cout << (*p++).getArea() << endl;
// 배열의 이름 circleArray를 포인터로 사용
for (int i = 0; i < 3; i++)
cout << (circleArray + i)->getArea() << endl;
// 포인터 p의 정수 연산 이용
Circle* p = circleArray;
for (int i = 0; i < 3; i++)
cout << (p + i)->getArea();
객체 배열 초기화
- 생성자를 사용하여 아래와 같은 방법으로 원소 객체를 초기화 가능
Circle circleArray[3] = { Circle(10), Circle(20), Circle() };
- 배열 선언시 {} 안에 호출할 생성자를 지정
- 여기서 Circle(10)은 매개변수 Circle(int r) 생성자를 호출, 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();
};
double Circle::getArea() {
return 3.14*radius*radius;
}
int main() {
Circle circleArray[3] = { Circle(10), Circle(20), Circle() }; // Circle 객체 배열 초기화
for(int i=0; i<3; i++)
cout << "Circle " << i << "의 면적은 " << circleArray[i].getArea() << endl;
}
다차원 객체 배열
- 2차원, 3차원 등 다차원 객체 배열 만들기 가능
- 2차원 배열도 1차원 배열과 동일하게, 각 원소 객체가 생성될 때 기본 생성자 Circle()이 실행되어 모든 객체의 radius 값이 1이 된다.
Circle circles[2][3]; // 2행 3열의 2차원 객체 배열 생성
728x90
'Programming Language > C++' 카테고리의 다른 글
[C++] this 포인터 (1) | 2023.12.01 |
---|---|
[C++] 동적 메모리 할당 및 반환 (1) | 2023.11.30 |
[C++] 포인터 (1) | 2023.11.30 |
[C++] 구조체 (0) | 2023.11.29 |
[C++] priority queue with Cpp (0) | 2023.11.29 |