C언어

c++ 공부 요점정리 1

뮹실이 2013. 10. 26. 23:18








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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
// ==========================================
// 1. 입출력
// ==========================================
//
// 과거 표준 출력
//
#include <iostream.h> // 과거 표준 헤더

cout << 출력대상;
cout << 출력대상1 << 출력대상2 << 출력대상3;
cout << 1 << 'a' << "string" << endl;

// endl : 줄바꿈(버퍼비움)
// << : shift 연산

//
// 현재 표준 출력
//
#include <iostream> // 새 표준 헤더

std::cout << 출력대상;
std::cout << 출력대상1 << 출력대상2 << 출력대상3;
std::cout << 1 << 'a' << "string" << std::endl;

//
// 과거 표준 입력
//
#include <iostream.h>

int val1, val2;

cin>> val1;
cin>> val2;

int result = val1 + val2;
// c++은 변수선언이 함수의 중간에 올 수 있다.
// c에서는 함수의 윗부분에 변수 선언해야한다.

cout<< "덧셈 결과 : " << result << endl;

//
// 현재 표준 입력
//
#include <iostream.h>

int val1, val2;

std::cin>> val1;
std::cin>> val2;
// 같은 의미 : std::cin>> val1 >> val2;


int result = val1 + val2;
// c++은 변수선언이 함수 어디서든지 가능
// c에서는 함수의 윗부분에 변수 선언해야함

std::cout<< "덧셈 결과 : " << result << std::endl;

// ==============================================
// 2 함수 오버로딩
// ==============================================

// c는 함수 이름 중복 불가
// c++은 함수 이름 중복 가능
// 같은 함수이름을 가지는 함수로
// 전달하는 매개변수(인자값) 갯수 or 타입이 달라야함
int func(void);
int func(int a, intb);

// or 

int func(int a);
int func(char a);

//
// 디폴트 매개 변수
//

int func(int a = 0);
// func함수 호출시 매개변수 전달이 없으면
// 0이 전달된것으로 처리

// 함수 선언과 정의를 분리할 경우
// 디폴트 매개 변수 선언은 함수 선언부에 한번만 정의해야함
int func(int a, int b = 0);

int main()
{
	std::cout<<func(1)<<std::endl;
	// a= 1, b = 0;
	// 결과 : 1;
}
int func(int a, int b)
{
	return a+b;
}

// 함수 오버로딩과 디폴트 매개변수를 동시에 사용할 경우
// 에러 발생 가능
int func(int a = 0);
int func(void);

int main(void)
{
	func();
	// func가 어떤 func를 호출해야할지 에러 발생 가능
}

// 함수오버로딩할 경우는 디폴트 매개변수 사용하지 않는게 좋음

// ======================================================
// 3 인라인(in line(source code)) 함수
// ======================================================
// 대표적 인라인화 : 매크로

// c 에서는 전처리기에 의해 처리
#define add(x) ((x)+(x))
// 하지만 복잡한 경우에는 구현하기 어려움

// c++ 에서는 컴파일러에 의해 처리(디버깅이 쉬움)
// 컴파일러에게 최적화의 기회 제공
// inline 키워드를 사용해서 성능이 떨어질 경우
// 컴파일러가 inline 키워드를 무시하고 
// 일반 함수로 처리해버림
// 구현 하기 쉬움
inline int add(int x);

// =====================================================
// 4 이름공간(namespace)
// =====================================================
// 이름 충돌을 막기위해서
// 공간에 이름을 주는 행위

//
// 이름공간 설정 전
//
void func(void);
void func(void);

void main(void)
{
	func(); // 에러 발생
}

//
// 이름공간 설정
//
namespace a
{
	// 변수 선언도 가능
	// 여러개의 함수 선언 가능
	void func(void);
}

namespace b
{
	// 변수 선언도 가능
	// 여러개의 함수 선언 가능
	void func(void);
}

void main(void)
{
	a::func(); // 에러 발생하지 않음
	b::func(); // 에러 발생하지 않음
	// :: -> 범위지정 연산자
}

// std 란 namespace !!!
namespace std
{
	//cout??
	//cin??
	//endl??
}

//
// 편의를 위한 using 선언
//
using a::func;
// a 라는 이름공간안의 함수(또는 변수)를 호출할 때는
// 그냥 func라는 이름으로만 사용하겠다는 의미
// 즉
a::func();

using a::func;
func();
// 위 두개가 같은 의미

using namespace a;
// a 라는 이름공간안의 함수나 변수를 그냥 사용하겠다는 의미
 
using namespace std;
// 를 선언함으로써 std:: 를 생략할 수 있지만
// 이름 충돌이 발생할 수 있으므로

using std::cout;
using std::cin;
using std::endl;
// 이렇게 쓰는것을 추천

//
// 범위 지정 연산자 기반 전역 변수 접근
//
int val = 100;

int main(void)
{
	ing val = 100;
	val += 1; // 지역변수 val을 사용하게 됨
	// 전역 변수 val이 지역변수 val에 가려진 상황
}

// 문제 해결 방법

int val = 100;

int main(void)
{
	ing val = 100;
	::val += 1; // 전역 변수 val을 사용하게 됨
	// :: (범위지정연산자)가 아무 범위도 지정하지 않는경우
	// 전역에 접근함
}