분류 전체보기
-
항목 2. auto의 형식 연역 규칙을 숙지하라.프로그래밍/Modern Effective c++ 2016. 3. 21. 14:48
auto는 한가지 예외를 제외하고 템플릿과 형식 연역 방식이 같다. auto x = 27; // 경우 3const auto cx = x; // 경우3const auto& rx = x; // 경우1 auto&& uref1 = x; // uref: int&auto&& uref2 = cx; // uref: const int&auto&& uref3 = 27; // uref: int&& const char name[] = "R. N. Briggs"; // name의 형식은 const char[13]auto arr1 = name; // arr1: const char*auto& arr2 = name; // arr2: const char (&) [13] void someFunc(int, double);auto func..
-
항목 1. 템플릿 형식 연역 규칙을 숙지하라.프로그래밍/Modern Effective c++ 2016. 3. 13. 23:54
auto는 템플릿에 대한 형식 연역을 기반으로 작동한다.하지만 이것이 auto에 적용될 때 템플릿에 적용될 때보다 덜 직관적인 경우가 있다.따라서 제대로 이해하기 위해서는 템플릿 형식 연역을 제대로 이해해야한다. 템플릿은 일반적으로 다음의 형태를 가진다.templatevoid f(ParamType param); f(expr); //호출 ParamType의 형태를 기준으로 세가지 경우를 살펴보자. 경우 1. ParamType이 포인터 또는 참조 형식이지만, 보편참조는 아닌 경우. 1. expr이 참조 형식이면 참조부분을 무시한다. --> 당연하다. expr이 참조형식인것은 자기한테만 중요할뿐 param에게는 아무의미가 없다. 2. 그다음 expr의 형식을 ParamType에 대해 패턴 매칭 방식으로 대응시..
-
1장 형식 연역프로그래밍/Modern Effective c++ 2016. 3. 13. 23:32
c++11에서 형식연역에 대한 두가지 규칙이 추가 되었다.auto와 decltype이 그것이다. 이덕분에 자명한, 또는 이미 선언된 형식들을 여러번 일일이 지저해야하는 경우가 크게 줄었다. 이제는 소스코드의 한 지점에 있는 형식을 변경하면, 그 변화가 형식 연역을 통해서 다른 장소들로 자동으로 전파되며, 겨과적으로 c++ 소프트웨어의 적응성이 높아졌다.하지만 코등의 의미를 추론하기는 좀더 어려워졌다. 컴파일러가 연역하는 형식이 추측한것과 다른 경우가 있기 때문이다. 때문에 형식 연역이 일어나는 방식을 확실하게 이해하지 않는다면, 현대적인 c++ 엣 효과적인 프로그래밍이 거의 불가능하다. 이번장에서는 형식 연역의 작동방식과 이에 기초한 auto와 decltype의 작동방식을 설명한다.
-
-
39. private 상속은 심사숙고해서 구사하자.프로그래밍/Effective c++ 2016. 3. 10. 16:42
private로 상속받으면 파생클래스 객체를 기본클래스 객체로 변환하지 않는다. 즉 다형성이 불가.public, protected멤버도 모두 private가 된다. --> is-implemented-in-terms-of의 의미. 기본 클래스와의 개념적 관계가 있어서가 아니라 기능들을 가져와서 구현하는데 쓸 목적. 인터페이스를 받기 위함이 아니다.소프트웨어 설계에서는 아무런 의미도 갖지 않으며, 단지 구현에서만 의미를 가질 뿐이다. class A{public: virtual void func();} B에서 A를 사용하고 싶을 때 다음과같이 사용 가능.class B : private A{private: vitual void func();} 이때 클래스 B를 파생은 가능하게 하되, 파생 클래스에서 가상함수를 ..
-
37. 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재정의하지 말자프로그래밍/Effective c++ 2016. 3. 10. 16:41
가상함수는 동적으로 바인딩 되는 반면, 매개변수는 정적으로 바인딩 되기 때문에기본 클래스와 파생클래스의 매개변수의 기본 지정값이 다르면 파생클래스 객체를 기본클래스 포인터로 받는 경우 기본 클래스의 기본 매개변수로 대입된다. class A{public: virtual void f(int i = 0);}class B{public: virtual void f(int i = 1);} A a = new B;a.f(); //--> i가 0으로 대입된다. 그래서 이런걸 하려면 private로 가상함수를 빼고 이를 호출하는 새로운 public함수를 만들어서 거기서 매개변수 기본값 설정을 하라는데... class B{public: void pubf(int i = 1){ f(i); }private: virtual voi..