1 교시
Tool : Visual Studio 2005 Express( 컴파일러 cl.exe)
#include <iostream> // 98년 재정된 표준 C++
프로젝트- 속성- 구성속성- C/C++ - 언어 : 언어 확장 사용 안 함
예 : 표준 언어를 사용한다. Cl컴파일러(MS꺼)에서 지원하는 언어 사용안함.
아니오 : MS함수들을 사용한다. atoi, itoa 등등..
Defalut Parameter
1. 마지막 파라미터(오른쪽)부터 차례대로 지정해야 한다.
2. 함수 선언부와 구현부로 나눌 때는 반드시 선언에 지정한다.
오버로딩
A) 리턴값은 영향을 주지 않는다. 단지 인자로만 구분한다.
B) 디폴트 파라미터가 있을때는 주의 해야 한다.
C) 잘못된 overloading은 코드의 방해만 될 뿐이다.
D) 오버로딩 함수를 찾는 순서를 알아두자.
E) 디자인 관점에서의 오버로딩.
- 동일 함수의 호출이 상황에 다르게 동작한다.
- 다형성 구현의 가장 기본문법이 오버로딩 !
1. 디자인 측면에서 - 다형성 지원의 기본문법 - 너무 좋은 기능
2. 원리 -> name mangling
3. 주의 -> c/c++ 에서 모두 사용 가능한 헤더 만들기
4. 함수 찾는 순서 - 5단계
- 1.Exactly Matching : 전달하는 인자와 정확히 일치하는 type이 있는지 찾는다.
- 2.Promotion : Data의 손실이 없는 방향으로의 변환이 가능한 함수가 있는지 찾는다.
- 3.Standard Conversion : 표준 Type들간의 암시적인 변환이 발생한 후 함수 호출.
- 4.User Define Conversion Operator : 사용자가 만든 변환 연산자가 있다면 이것을 사용하여 변환후 함수 호출.
- 5.'...;을 인자로 갖는 함수 : 가변 파라미터를 갖는 함수는 파라미터의 Type이나 계수에 무관하게 호출.
2교시
a.cpp // C++ main()에서 #include "b.h"(C언어)의 Add() 함수를 호출하기.
b.c // Add( int a, int b );
b.h
문제점:
error LNK2019: "int __cdecl Add(int,int)" (?Add@@YAHHH@Z)
외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
->C++컴파일러는 함수오버로딩을 위해 함수의 이름을 변환(name mangling)한다.
그러므로 C에서 함수를 불러오게 되면 함수의 이름을 찾지 못하게 된다.
해결책:
extern "C"
C++ 컴파일러에서 C 문법으로 컴파일 해달라는 지시어.
// 이름변환(name mangling)이 발생 하지 않는다.
문제점:
a.cpp를 a.c 로 바꾸게 되면 C에서 지원하지 않는 extern "C"를 사용하지 못한다.
error C2059: 구문 오류 : '문자열'
// 모든 C++ 컴파일러는 __cplusplus 라는 매크로를 내부적으로 정의하고 있다.
해결책:
#ifdef __cplusplus
extern "C" {
#endif
int Add(int , int);
#ifdef __cplusplus
}
#endif
// 결론 어떤 함수를 만들어서 c/c++에서 모두 사용하려면
// 1. 소스는 .c로 만든다. - 함수이름 변환이 발생되지 않게
// 2. .h는 위의 기법을 적용해서 c/c++모두에서 사용할 수 있게 한다.
3교시
// C에서 함수 1개로 모든 type에 안전하게 동작하는 함수 만들기
// 매크로 함수 : 모든 type에 동작하는 함수 만들때 사용.
// 단점 - 버그가 많다.( 특히, ++이 들어가면... )
//#define square( x ) ((x) * (x))
// C++의 해결책 - template
// 일반함수 : 값이 전달된다.
// 함수 template : type과 값이 전달된다.
template<typename T> T square( T a )
{
return a * a;
}
template<typename T> T Max( T a, T b )
{
return a < b ? b : a;
}
void main()
{
cout << Max(1, 2) <<endl;
cout << Max<int> ( 65, 'B' ) << endl;
// template의 명시적
// 인스턴스화..
// 명시적으로 type을 전달한다는 의미.
}