3.7 타입이 아닌 템플릿 매개변수 값도 템플릿 인자가 될 수 있다. 정수, bool, 토인터 타입만 가능 template class fsize_vector { using self = fsize_vector; public: using value_type= T; const static int my_size = Size; fsize_vector(int s= Size) { assert(s == Size); } self& operator=(const self& that) { std::copy(that.data, that.data + Size, data); return *this; } self operator+(const self& that) const { self sum; for (int i= 0; i < my..
템플릿 특수화 템플릿은 많은 인수타입에 대해 동일한 구현을 사용할수 있다. 그러나 일부 타입에 대해서는 다른동작을 구현해야 할때도 있다. 이를 위해 템플릿 특수화(Template Speicalization)을 사용하자. 하나의 타입에 대한 특수화 벡터 클래스에서 bool타입에 대해 특수화 bool값을 1바이트로 패킹하여 메모리 절약을 해보자. template class vector { public: explicit vector(int size) : my_size(size), data(new unsigned char[(my_size+7) / 8]) {} vector() : my_size(0) {} //상수 접근 연산자 bool operator[](int i) const { return (data[i/8] ..
3.4 타입 추론과 정의 auto 변수 타입 auto타입은 모든 표현식에 적용되는 자동타입이 아닌 한번 정해진 뒤에는 변하지 않는 타입 auto i = 2 * 7.5, j = std::sqrt(3.7); //정상: double auto i - 2 * 4, j = std::sqrt(3.7); //오류: i=int j=double auto i = 2 * 4, j; //오류: j가 초기화되지 않음 auto v = g(x, y, z); //g의 결과 타입 auto& ri = i; //i에 대한 레퍼런스 const auto& cri = i; //i에 대한 const 레퍼런스 auto&& ur = g(x, y, z); //g결과에 대한 포워드 레퍼런스 표현식의 타입 (C++11) decltype은 표현식의 타입을 ..
3.3 클래스 템플릿 컨테이너 예제 템플릿을 사용하여 제네릭 클래스를 만들어보자 template class vector { public: explicit vector(int size) //암시적 변환을 막음 explicit : my_size(size), data( new T[my_size] ) {} vector() : my_size(0), data(0) {} vector(const vector& that) : my_size(that.my_size), data(new T[my_size]) { std::copy(&that.data[0], &that.data[that.my_size], &data[0]); } int size() const { return my_size; } const T& operator[](..
3.2 네임스페이스와 함수 룩업 네임스페이스 struct global {}; namespace c1 { struct c1c{}; namespace c2 { struct c2c {}; struct cc { global x; c1c y; c2c z; } } } struct same {}; //#1 namespace c1 { struct same {}; //#2 namespace c2 { struct same {}; //#3 struct csame { ::same x; //#1 c1::same y; //#2 same z; //#3 } } } struct same {}; //#1 namespace c1 //#a { struct same {}; //#2 namespace c2 { struct same {}; //..
제네릭 프로그래밍 함수 템플릿 함수 템플릿(Function Template)은 잠재적으로 무한한 함수 오버로드를 생성하는 청사진 int max(int a, int b) { return a > b ? a : b; } int max(double a, double b) { return a > b ? a : b; } //위 두개의 함수를 템플릿을 사용하면 아래와 같이 한번만 구현하면 된다 template T max(T a, T b) { return a > b ? a : b; } //다음 함수는 각 리터럴에 의해 각 타입이 인스턴스화 된다 cout
연산자 오버로딩 디자인 일관성있게 디자인하자 도메인 특정 임베디드 언어(Domain-Specific Embedded Language) DSEL 특정 영역의 해결이나 표현을 위해 그 영역에 맞는 특화된 도구를 사용하자는 의미인 듯 우선순위를 존중하자 오버로드한 연산자의 의미와 의도한 우선순위가 C++의 우선순위와 일치하도록 하자 A = B ^ 2 + C; // B제곱에 C를 더하고 싶었겠지만 A = B ^ (2 + C); //컴파일러에서는 이렇게 이해한다 멤버함수 또는 자유 함수 std::cout
2.6 멤버 변수에 접근하기 접근 함수 //게터와 세터를 도입하여 변수에 접근 complex c; c.set_r(c.get_r() + 5); class complex { public: double& real() {return r;} } //레퍼런스를 반환하는 함수를 사용 c.real() += 5; //자유함수 선언 inline double& real(complex& c) { return c.real(); } 첨자 연산자 class vector { public: double at(int i) { assert(i >= 0 && i = 0 && i < my_size); ret..
2.4 소멸자 소멸자는 개체를 파괴할 때 마다 호출되는 함수 구현 규칙 소멸자에서 예외를 던지지 말라 noexcept로 암시적 선언되어 C++11이상에서는 항상 실행을 중단하는 런타임 오류로 처리 클래스에 virtual 함수가 있으면 소멸자도 virtual이어야 한다 리소스 제대로 처리하기 개체가 메모리와 같은 리소스를 할당하는 경우 소멸자가 필요 class vector { public: ~vector() { delete[] data; } private: unsigned my_size; double *data; } 리소스 획득은 초기화 Resource Acquisition is Initialization (RAII) 메모리 누수를 막기위해 모든 예외 발생시 마다 리소스를 해제를 수동으로 해야한다. uni..
2.3 생성자 및 할당 연산자 생성자 class complex { public: //디폴트 생성자 complex(double rnew, double inew) : r(), 1() //컴파일러가 생성 { r = rnew, i = inew; } //멤버 초기화 리스트(Initialization List)를 이용한 생성자 //초기화 순서와 정의 순서가 일치하지 않으면 컴파일러가 경고를 출력 complex(double rnew, double inew) : r(rnew), i(inew) {} private: double r, i; } //생성자를 통한 값 설정 complex c1(2.0, 3.0); class matrix_type { public: matrix_type(int nrows, int ncols) {}..
2. 클래스 2.2 멤버 멤버 변수 class complex { public: double r, i; } complex z, c; z.r = 3.5; z.i = 2; c.r = 2; c.i = -3.5; //멤버 변수는 도트 연산자 . 를 사용하여 접근 할 수 있다 std::cout
1.9 소프트웨어 프로젝트 구축 주석 //한줄 짜리 주석 //일부 코드를 주석처리 하고 다른 코드를 작성할때 사용 /*로 시작하는 주석은 여러 /*으로 주석을 시작해도 첫번째 */으로 주석이 해제된다 전처리기 지시문 매크로 매크로 이름을 인수와 함께 텍스트 정의로 확장해 코드를 재사용하는 기법 대부분의 매크로는 다른 기법(상수, 템플릿, 인라인 함수)으로 대체할 수 있다 포함 #inclde //표준 include 디렉토리에서 해당파일을 검색 #include "math_function.hpp" //현재 디렉터리에서 먼저 검색후 표준 경로에서 검색 //상위 디렉토리를 검색 경로에 추가하고 지시문세어 상대 경로를 사용 가능 #include "herberts_includes/math_fuction.hpp" #i..