티스토리 뷰
객체 포인터
- 객체에 대한 포인터이다.
- C언어의 포인터가 값의 주소값을 저장하듯, C++의 객체 포인터는 객체의 주소값을 가진다.
- '포인터'로 멤버에 접근 할 때, p -> 멤버 형식으로 접근한다.
객체포인터 선언 예.
<소스 코드>
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
32
33
34
35 |
#include <cstdlib>
#include <iostream>
using namespace std;
class Circle {
int radius;
public:
Circle() { radius=1;}
Circle(int r) {radius=r;}
double getArea();
};
double Circle::getArea() {
return 3.14*radius*radius;
}
int main(int argc, char *argv[])
{
//객체 포인터 접근 예제
//
Circle donut;
//1.객체 포인터 선언
Circle *p;
//2. 초기값 지정
p = &donut; //donut 객체의 주소를 저장.
//3. 포인터(p)를 이용해서 멤버 함수(getArea())에 접근.
//기호는 -> 또는 (*p).멤버함수
cout <<"donut의 넓이 : "<< p->getArea() << endl;
// cout << (*p).getArea() << endl;
system("PAUSE");
return EXIT_SUCCESS;
} |
cs |
<실행 결과>
객체 배열
- 기본 타입(int, doube..) 배열 선언과 동일한 방식으로 선언한다.
*객체 배열 형식
int n[3]; // 정수형 배열 선언
Circle c[3]; // Circle 타입의 배열 선언
2. 객체배열 선언 예 (객체배열에서 생성자, 소멸자 실행 방법)
<소스 코드>
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 |
#include <cstdlib>
#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(int argc, char *argv[])
{
//객체 배열 예제
//1.객체 배열 선언(자료형 배열 이름[크기])
Circle circleArray[3];
//2.객체배열의 멤버에 접근
circleArray[0].setRadius(10);
circleArray[1].setRadius(20);
circleArray[2].setRadius(30);
//3개의 객체의 면적을 출력
for(int i = 0; i < 3; i++)
cout << "각 Circle "<< i << "의 넓이 : "<< circleArray[i].getArea() << endl;
//포인터로 circle 배열에 접근해서 출력하는 코드
//1.포인터 변수 선언.
Circle *p;
//2. 초기값 지정
p = circleArray;//배열 이름 = 메모리의 시작주소이므로 &없이 주소저장(초기값)
for(int i = 0; i < 3; i++){
cout << "각 Circle "<< i <<"의 넓이: " << p->getArea() << endl;
p++;
}
system("PAUSE");
return EXIT_SUCCESS;
} |
cs |
<실행 결과>
<객체배열 선언 예2(초기화) 소스코드>
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
32 |
#include <cstdlib>
#include <iostream>
using namespace std;
class Circle {
int radius;
public:
Circle() {radius = 1;}
Circle(int r) {radius = r;}
double getArea(){ return 3.14*radius*radius; }
};
int main(int argc, char *argv[])
{
//반지름이 15인 waffle 객체 선언
Circle waffle(15);
//객체배열 선언 : 크기 3인 객체배열 CircleArray를 선언
//Circle circleArray[3]; // 개게배열은 기본생성자를 호출한다. 기본생성자를 만들어 줘야 한다.
//객체배열의 초기화 : 생성자함수를 호출하여 지정한다.
Circle circleArray[3] = {Circle(10), Circle(20), Circle()};
//배열 출력
for(int i = 0; i < 3; i++)
cout << "Circle " << i << "의 면적은 " << circleArray[i].getArea() << endl;
system("PAUSE");
return EXIT_SUCCESS;
} |
cs |
<실행 결과>
소멸자
- 함수가 종료하면 함수 내에 선언된 배열도 소멸된다.
- 객체가 소멸될 때 각 원소 객체마다 소멸자가 호출된다.
동적메모리 할당 및 반환
(1) 정적 할당
- 변수 선언을 통해 필요한 메모리 할당한다.
- 메모리 낭비가 발생할 수 있다.
(2) 동적 할당
- new 연산자를 이용해 객체의 동적 생성 - 힙 메모리로부터 객체를 위한 메모리 할당 요청한다.
- 객체 할당 시 생성자 호출한다.
*new 사용 형식
데이터타입 *포인터변수 = new 데이터타입 ;
delete 포인터변수;
- delete 연산자를 이용해 new로 할당 받은 메모리 반환한다.
- 객체의 동적 소멸 - 소멸자 호출 뒤 객체를 힙에 반환한다.
* delete 사용 형식
int *pInt = new int; // int 타입의 메모리 동적 할당
char *pChar = new char; // char 타입의 메모리 동적 할당
Circle *pCircle = new Circle(); // Circle 클래스 타입의 메모리 동적 할당
delete pInt; // 할당 받은 정수 공간 반환
delete pChar; // 할당 받은 문자 공간 반환
delete pCircle; // 할당 받은 객체 공간 반환
<동적 메모리 할당 예제 소스 코드>
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
32 |
#include<iostream>
using namespace std;
//동적할당 예 : 힙영역에 입력받은 크기의 배열을 생성
int main() {
cout << "입력할 정수의 개수 : ";
int n;
cin >> n;//heap 메모리 공간에 할당 받을 크기를 입력
int *p;//할당 받은 메모리 주소를 담을 포인터 변수
p = new int[n];//입력받은 크기로 배열을 사용.
if (!p) { //메모리 할당 받지 못했을 떄 !p 이다.
cout << "메모리를 할당 할 수 없습니다.";
}
//heap에 할당 받은 배열의 내용을 입력
for (int i = 0; i < n; i++) {
cout << i << "번째 정수 : ";
cin >> p[i];
}
//heap에 저장된 배열내용 출력
for (int i = 0; i < n; i++) {
cout << p[i] << " ";
}
delete[] p; // heap 공간을 반납
return 0;
} |
cs |
<실행결과>
(3) <객체배열의 동적할당 예제 소스코드>
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 |
#include <cstdlib>
#include <iostream>
using namespace std;
//객체배열 생성, 소멸 예제
class Circle {
int radius;
public:
Circle();
Circle(int r);
~Circle();
void setRadius(int r) { radius = r; }
double getArea() { return 3.14*radius*radius; }
};
Circle::Circle() {
radius = 1;
cout << "생성자 실행 radius = " << radius << endl;
}
Circle::Circle(int r) {
radius = r;
cout << "생성자 실행 radius = " << radius << endl;
}
Circle::~Circle() {
cout << "소멸자 실행 radius = " << radius << endl;
}
int main(int argc, char *argv[])
{
//동적할당 : 객체배열생성
//*ppArray를 선언한 이유는 주소를 받는 포인터 변수가 필요하기 떄문.
Circle *pArray = new Circle[3]; //heap 영역에 3개의 객체 배열 생성
//객체배열의 초기화
int value = 10;
for(int i = 0; i < 3; i++){
value += i;
pArray[i].setRadius(value);
}
//heap의 객체배열내용 출력
for(int i = 0; i < 3; i++){
cout << pArray[i].getArea() << endl;
}
delete[] pArray; //객체밸열 반환
system("PAUSE");
return EXIT_SUCCESS;
} |
cs |
<실행 결과>
기본 자료형의 동적 할당
(1) 형식
int *p = new int;
delete p;
(2) 초기값
int *p = new int(20);
배열의 동적할당
(1) 형식
int *p = new int[5];
delete[] p;
(2) 초기값
int *p = new int[10](20)// 구문 오류
객체 동적 할당
(1) 형식
Circle *p = new Circle;
delete p;
(2) 초기값
Circle *p = new Circle(20);
(3) 소멸자
소멸자 : 순서에 상관 없이 실행
객체의 정적할당에서 소멸자 실행
배열의 동적할당
(1) 형식
Circle *p = new Circle[3];
delete[] p;
(2) 초기값
Circle *p = new Circle[3](30)// 구문 오류
'객체 지향 프로그래밍 > 이론 정리' 카테고리의 다른 글
[C++]함수와 참조, 복사 생성자 (0) | 2017.11.01 |
---|---|
[C++]this 포인터, string 클래스 (0) | 2017.10.18 |
[C++]접근지정자, 인라인 함수, 구조체, 파일분리 (0) | 2017.09.27 |
[C++]기본생성자 예제, 생성자의 특징, 소멸자 (0) | 2017.09.21 |
[C++]클래스와 객체, 생성자 (1) | 2017.09.20 |
- Total
- Today
- Yesterday
- 파이썬 함수
- 파이썬 선택문
- 자바스크립트 그래프
- 파이썬 단계적 개선
- 명품 c++ 실습
- 자바 에센셜 실습문제
- 백준 1874
- 버츄어박스
- 파이썬 진수 변환
- 파이썬
- 파이썬 문자열
- 웹
- 자바스크립트 자료구조
- css
- css 그리드
- 백준 10451
- 파이썬 리스트
- 파이썬 터틀
- 파이썬 예제
- 파이썬 클래스
- css 박스
- 파이썬 for
- 파이썬 while
- 자바
- 파이썬 연산자
- 파이썬 if문
- 백준
- 백준 11501
- 파이썬 객체
- 자료구조
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |