6.5 변환 C++에는 서로 다른 4가지의 형변환 연산자가 있다. static_cast dynamic_cast const_cast reinterpret_cast C스타일 형변환도 지원하지만 C스타일 형변환은 사용하지 말자 기본 클래스와 파생 클래스 간의 변환 업 캐스팅 업 캐스팅(Up Casting)은 기본 클래스에서 파생 클래스로의 형변환은 모호함이 없으면 항상 가능하다. struct A { int ma; } struct B : A { float mb; int fb() { return 3;} }; struct C : A { }; struct D : B, C { }; void f(A a) {}; void g(A& a) {}; void h(A* a) {}; int main { B b; //모두 A타입 개체..
6.4 서브 타입별 동적 선택 switch문을 이용해 프로그램을 동적으로 선택하도록 구현해보자. class matrix {}; class vector {}; void cg(const matrix& A, const vector& b, vector& x); void bicg(const matrix& A, const vector& b, vector& x); struct solver { virtual void operator()(const matrix& A, const vector& b, vector& x)= 0; virtual ~solver() {} }; // 잠재적으로 템플릿화 됨 struct cg_solver : solver { virtual void operator()(const matrix& A, co..
6.3 다중 상속 복수의 부모 클래스 클래스는 여러 슈퍼 클래스에서 파생될 수 있다. class student { virtual void all_info() const { cout
중복 제거 상속과 암시적 업 캐스팅을 사용해 불필요한 멤버와 자유함수의 구현을 피할 수 있다. 클래스가 슈퍼 클래스로 암시적 형변환된다 공통 기능을 한번만 구현하고 모든 파생 클래스에서 이 공통 기능을 재사용 할수 있다. 다음 행렬의 예제와 같이 공통 기능을 한곳에서 구현하게 되면 모든 클래스의 변경사항을 즉시 적용 할 수 있다. 자유함수는 암시적 업 캐스팅 덕분에 파생된 모든 클래스에서 호출 가능하다 class base_matrix { public: base_matrix(size_t nr, size_t nc) : nr(nr), nc(nc) { } size_t num_rows() const { return nr; } size_t num_cols() const { return nc; } private: s..
6. 객채 지향 프로그래밍 6.1 기본 원칙 추상화(Abstraction) : 클래스는 개체의 특성과 멤버 함수를 정의, 클래스는 특성의 불변성을 지정할 수도 있음 캡슐화(Encapsulation) : 구현의 세부 사항을 숨기는 원칙. 내부 특성은 불변성을 위반하지 않기 위해 직접 접근 할 수 없으며, 클래스의 멤버 함수를 통해서만 접근할 수 있다. 상속(Inheritance) : 파생 클래스가 기본 클래스의 모든 멤버 변수와 멤버 함수를 포함한다는 원칙 다형성(Polymorphism) : 문맥이나 매개변수에 따라 해석하는 식별자의 능력 기본 클래스와 파생 클래스 class person { public: person() { } explicit person(const string& name) : name(..
표현식 템플릿 간단한 연산자 구현 template inline vector operator+(const vector& x, const vector& y) { x.check_size(size(y)); vector sum(size(x)); for(int i = 0; i < size(x); i++) sum[i] = x[i] + y[i]; return sum; } vector x,y,z,w; w = x + y + z; 다음과 같은 연산 횟수가 수행된다 덧셈 2n번 할당 3n번 읽기 5n번 쓰기 3n번 메모리 할당 2번 메모리 할당 해제 2번 단일 반복문이나 인라인 함수로 작성한다면 template void inline add3(const vector& x, const vector& y, const vector&..
5.2 타입 정보 제공하기 및 사용하기 타입 특성 template T inline min_magnitude(const T& x, const T& y) { using std::abs; T ax = abs(x), ay = abs(y); return ax < ay ? x : y; } double d1 = 3., d2 = 4.; cout
5 메타 프로그래밍 5.1 컴파일러가 계산하도록 만들기 컴파일 타임 계산은 두가지 방법이 있다. 템플릿 메타 함수(Meta-Function)를 사용 constexpr을 사용 (C++11) 컴파일 타임 함수 constexpr long fibonacci(long n) { return n 0) r *= x; return r; } 소수판정 // 1은 소수가 아니다 // 2를 제외한 짝수는 소수가 아니다. // 1보다 큰 홀수와 자기 자신보다 작은수로 나눌수 없는가? // 자신의 제곱근 값보다 낮은수까지만 검사해도 된다 const bool is_prime(int i) { if( i == 1) return false; if( i % 2 == 0 ) return i == 2; int max_check = static..
4.6 동시성 c++11에서 동시성 기능이 처음으로 도입되었다. thread: 새로운 실행 경로를 위한 클래스 async: 함수를 비동기로 호출 atomic: 인터리브(Interleave) 되지 않은 값에 접근하기 위한 클래스 템플릿 mutex: 상ㅎ호 배타적인 실행을 조정하는 클래스 future: thread로부터 결과를 받기위한 클래스 템플릿 promise: future를 위해 값을 저장하는 템플릿 여기서는 비동기로 동작하면 인터럽트 가능한 프로그램을 구현해보고자 한다 비동기식(Asynchrony): 프로그램을 실행하는 동안 다음모델에서 작업 가능 인터럽트 가능성(Interruptibility): 새로운 모델이 더 좋으면 이전 모델을 중단 class interruptible_iteration { pu..
4.5 지금 시각은? 라이브러리는 타입 세이프한 시계 및 타이머 기능을 제공 클럭을 기준으로 특정 시점을 나타내는 time_point 명백한 의미를 지닌 duration time_point now = system_clock::now(), then = now + hours(2); time_t then_time = system_clock::to_time_t(then); cout eps); return sq; } time_point start = steady_clock::now(); for( int i = 0; i < rep; i++) { r3 = my_root(3.0); } auto end = steady_clock::now(); cout
4.4 유틸리티 튜플 새로운 클래스를 구현하지 않고 여러결과를 반환하기 위해 튜플(Tuple)을 사용 대부분의 컨테이너와는 달리, 개체의 개수를 컴파일 타임에 알고 있어야 함 void lu(const matrix& A, matrix& LU, vector& p) {...} tuple lu(const matrix& A) { matrix LU(A) vector p(n) ... //둘다 반환값은 동일 return tuple(LU, p); return make_tuple(LU, p); //헬퍼 함수 } int main() { tuple t = lu(A); //튜플의 값을 가져올때는 get함수를 통해 추출한다 matrix LU = get(t); vector p = get(t); //모두 추론 가능하기에 위와 동일 ..
4.3 메타 프로그래밍 한계 헤더를 포함해야함 내장 타입별 정보를 전달하는 클래스 템플릿 numeric_limits template inline void test(const T& x) { cout