728x90

황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!

https://search.shopping.naver.com/book/catalog/32436115747

 

C++ Programming : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

객체 포인터

  • 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