2013. 11. 21. 22:07 C언어

c++ 공부 요점정리 10








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
176
177
178
// =====================================================
// 25 복사 생성자의 의미
// =====================================================
//
// 초기화하는데는 두가지 방법이 있다.
// 
int main(void)
{
	int val1(20);
	// 만약 int가 기본자료형이 아니라
	
	// 클래스로 정의했다면
	
	// int라는 클래스를 val1이라는 이름으로
	
	// 생성하면서 20이라는 정수를 받을 수 있는
	
	// 생성자를 호출하겠다.
	
	// 그러나 int는 기본자료형이기 때문에
	
	// val1을 20으로 초기화 하겠다는 의미이다.
	
	int val1 = 20;
	
	// 과 같은 문장이다
	
	// 그래서 보통은 첫번째 문장을 C++ 스타일이라고 하고
	
	// 두번째 문장을 c 스타일이라고 한다.
	
	AAA a1 = 10; 
	// 이 문장은 다음의 문장으로 묵시적으로
	
	// 변환되어 진다.
	AAA a1(10);
	// 즉, C++에서는 두 문장이 같다.
	
	// 묵시적으로 변환되어 지기 때문에 같다.
	
	// 첫번째 문장처럼 초기화하는 것은
	
	// 권장하지 않음
}

//
//
// 
#include<iostream>
using std::cout;
using std::endl;

class AAA
{
public:
	AAA(){
		cout<<"AAA() 호출"<<endl;
	}
	AAA(int i){
		cout<<"AAA(int i) 호출"<<endl;
	}
	// AAA 클래스인 obj3 객체를 생성하는데 있어서
	
	// AAA 클래스의 객체인 obj2를 인자로 받는
	
	// 생성자
	
	// AAA 클래스를 참조해 a라는 이름으로 
	
	// 인자로 전달받고
	
	// 받는 인자를 const로 선언해 값을 저장하지
	
	// 않겠다는 의미
	
	// 이런 형태의 생성자를 복사생성자라한다.
	
	// 이 생성자는 복사를 하기 위한 용도로 사용할 
	
	// 수있는 생성자이다. 그래서 복사 생성자
	
	// 즉 생성자의 이름에 해당하는 클래스의 객체를
	
	// 전달 받을 수 있는 생성자가 복사 생성자이다
	
	AAA(const AAA& a){
		cout<<"AAA(const AAA& a) 호출"<<endl;
	}
};

int main(void)
{
	AAA obj1; 		// AAA() 호출
	AAA obj2(10);	// AAA(int i) 호출
	AAA obj3(obj2);	// AAA(const AAA& a) 호출

	return 0;
}

//
// 예제
//
#include<iostream>
using std::cout;
using std::endl;

class Point
{
	int x, y;
public:
	Point(int _x, int _y){
		x=_x;
		y=_y;
	}
	// 복사 생성자 Point(const Point& p)는
	
	// 선언하지 않아도 컴파일러가 자동으로 
	
	// 추가해준다
	
	// 즉, 디폴트 복사 생성자가 컴파일러에 
	
	// 의해 제공됨(복사 생성자를 선언하지 
	
	// 않았다면)
	
	// 디폴트 생성자와 디폴트 소멸자는
	
	// 자동으로 제공되지만 하는일은 아무거도
	
	// 없다. 단지 객체의 생성과 소멸 일련의 과정을
	
	// 같게 하기 위해서 형식적으로 제공되었음
	
	// 디폴트 복사 생성자는 하는일이 있음!!
	
	// p1의 멤버값을 p2의 멤버값에 복사한다
	
	// 즉,멤버 변수 대 멤버 변수의 복사를 수행
	
	Point(const Point& p){
		x=p.x;
		y=p.y;
	}
};

int main(void)
{
	Point p1(10, 20);
	Point p2(p1);
	// p2의 x,y의 값은 p1의 x,y의 값으로 초기화된다.
	
	// p2를 생성하되, p1의 멤버 변수를 p2에 복사한다.
	
	// p1이 인자로 전달되고 있어 p1에 접근이 가능해짐
	
	// p1의 멤버 값을 참조해낼수 있다.
	
	// 즉, p2의 값을 p1의 값으로 초기화하고 싶은데
	
	// 접근할 수가 없었지만
	
	// 복사 생성자를 통해서 가능하다
	
	return 0;
}

//
// 디폴트 복사 생성자

// : 사용자 정의 복사 생성자(사용자 복사 생성자)가

//   없을 때 자동으로 삽입됨

//   멤버 변수 대 멤버 변수의 복사를 수행

//   디폴트 복사 생성자 복사 형태는 얕은 복사(shallow copy)
//










'C언어' 카테고리의 다른 글

c++ 공부 요점정리 12  (0) 2013.11.23
c++ 공부 요점정리 11  (0) 2013.11.21
c++ 공부 요점정리 9  (0) 2013.11.21
c++ 공부 요점 정리 8  (0) 2013.11.20
c++ 공부 요점 정리 7  (0) 2013.11.20
Posted by 뮹실이

최근에 달린 댓글

06-08 22:27
Yesterday
Today
Total