2013. 11. 20. 22:48 C언어

c++ 공부 요점 정리 8







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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
// =====================================================
// 23 객체의 배열과 생성자
// =====================================================
//
// 객체 배열은 객체를 멤버로 지니는 배열이다
//
// 객체 생성하면서 어떤 생성자를 호출할지
//
// 선언하지 않으면 기본적으로  void 생성자를
//
// (즉, 인자를 받지 않는 생성자를)호출한다.
//
// 예제
//
#include<iostream>
using std::cout;
using std::endl;

class Point
{
	int x;  
	int y;  
public:
	Point(){
		cout<<"Point() call!"<<endl;
		x=y=0;
	}
	Point(int _x, int _y){
		x=_x;
		y=_y;
	}
};

int main()
{
	Point arr[5]; // Point()가 5번 호출된다.
	return 0;
}

//
// 객체의 포인터 배열
// : 객체를 가리킬 수 있는 포인터를 멤버로
//   지니는 배열
//   객체의 동적 생성 방법

point* arr[5];
// 포인트 객체를 가리킬수 있는
//
// 포인터 타입으로 구성된 배열
//
// 즉, arr이라는 배열의 각각의 요소는
//
// 포인트 객체를 저장할 수 있는

// 포인트 클래스의 포인터로 구성되어 있음
//
// 포인터는 무조건 4바이트이므로(32비트 시스템)
//
// arr은 20바이트의 메모리 공간이 할당된다.
//
//
//
//   객체의 동적 생성 방법 예제
//
#include<iostream>
using std::cout;
using std::endl;

class Point
{
	int x;  
	int y;  
public:
	Point(){
		cout<<"Point() call!"<<endl;
		x=y=0;
	}
	Point(int _x, int _y){
		x=_x;
		y=_y;
	}
};

int main()
{
	Point* arr[5]; // point 객체를 가리킬수 있는
					// 포인터 배열 생성
					// main 함수 내에서 선언되었기 
					// 때문에 스택에 존재

	for(int i=0; i<5; i++)
	{
		arr[i]=new Point(i*2, i*3);  
		// new에 의한 객체 동적 생성.
		// 힙에다가 i*2, i*3를 인자 값으로 하는
		// 생성자를 호출해서
		// point 객체를 생성하겠다는 의미
		// 생성한 객체의 주소값을 arr[i]에 대입
		// 이 객체들은 new에 의해서 힙에 존재
		
		new int;
		// int 형 변수를 저장할 수 있는 공간을
		// 힙에다가 생성하겠다
		new int[10];
		// int 형 변수 10개를 저장할 수 있는 공간을
		// 힙에다가 할당하겠다
	}

	for(int k=0; k<5; k++)
	{
		delete arr[k];  // 힙에 저장된 객체 소멸.
	}
	return 0;
}

// 스택에 존재하는 포인터 배열이 힙에 존재하는 
// point 객체를 가리킨다.

//
// this 포인터 예제
//
#include <iostream>
using std::cout;
using std::endl;

class Person 
{
public:
	Person* GetThis(){ // Person 타입이니까
						// Person 포인터를 리턴
		return this; //this 포인터를 리턴.
					// this 는 자기 자신을 
					// 나타내는 포인터를 리턴
	}
};

int main()
{
	Person *p1 = new Person();
	cout<<"포인터 p1의 주소: "<<p1<<endl;
	cout<<"p1의 this: "<<p1->GetThis()<<endl;
	// 위 두 결과가 같음

	Person *p2 = new Person();
	cout<<"포인터 p2의 주소: "<<p2<<endl;
	cout<<"p2의 this: "<<p2->GetThis()<<endl;
	// 위 두 결과가 같음

	return 0;
}
//
// this 포인터는 객체 자신의 주소값을 나타낸다
// : this 는 자기 참조 포인터
//
// this 포인터의 용도
// : 연산자 오버로딩에서 유용하게 사용
//
class Data
{
	int aaa;
	int bbb;
public :
	Data(int aaa, int bbb){
		this->aaa = aaa;
		this->bbb = bbb;
		// this를 이용하면 지역변수에 의해
		// 멤버변수가 가려졌더라도
		// 멤버변수에 접근할 수 있다.
		// this->aaa는 객체의 주소값을 가지고
		// aaa에 접근하므로 
		// data 클래스의 aaa를 의미함
		// 그냥 aaa는 매개변수 aaa를 의미
		// (전달인자 값 aaa)
	}
}








Posted by 뮹실이

최근에 달린 댓글

06-07 21:21
Yesterday
Today
Total