Effective Modern C++30 재정의 함수들은 override로 파생 클래스의 가상함수 구현이 부모 클래스의 해당 가상 함수를 재정의 한다. 가상 함수 재정의(overriding)은 파생 클래스 함수를 부모 클래스의 인터페이스를 통해 호출할 수 있게 만드는 메커니즘이다. 재정의를 하기 위해서 필요한 조건들이 있는데, 1. 부모 클래스 함수가 반드시 가상함수여야 하고, 2. base 함수와 derived 함수의 이름이 동일해야 하며, 3. 매개변수 형식들이 동일해야 한다. 또한 4. const성이 동일해야 하며, 5. 반환 형식과 예외 명세가 호환되어야 한다. 그리고 6. 참조 한정사들이 반드시 동일해야 한다. C++11은 파생 클래스 함수가 부모 클래스 버전을 재정의 한다는 의도를 override를 사용해 명시적으로 표현한다. class Base { public: v.. 2020. 7. 5. 정의되지 않은 비공개 함수보다는 삭제된 함수를 C++98에서는 특정 함수(주로 복사 생성자 / 복사 배정 연산자)를 호출하지 못하게 하기 위해 private으로 선언하고 정의는 하지 않았다. 그렇기 때문에 클라이언트는 호출 할 수 없고, 의도적으로 정의하지 않았기 때문에 호출에 실패한다. C++11에서는 복사 생성자와 복사 배정 연산자 선언 끝에 "= delete"를 붙여 삭제된 함수를 만드는 것으로 같은 목적을 달성 할 수 있다. 삭제된 함수는 어떤 방법으로도 사용할 수 없으며, 멤버 함수나 friend 함수에서 복사하려하면 컴파일이 실패한다. 삭제된 함수는 주로 public으로 선언하는 것이 관례이며, 그 어떤 함수도 삭제 할 수 있다. bool test(int num); if (test('a')) ... if (test(true)) ... if.. 2020. 7. 3. 범위 없는 enum 보다 범위 있는 enum으로 범위 없는 enum(unscoped enum) C++98에서 enum으로 선언된 열거자들은 enum을 포함하는 범위에 속하며, 그 범위에 같은 이름이 있으면 안된다. (열거자들이 enum의 범위 밖으로 새어나간다) enum Color { black, white, red }; auto white = false;// white가 Color의 범위에 속해 있기 때문에 오류 또한 암묵적으로 정수 형식으로 변환된다. enum Color { black, white, red }; std::vector primeFactors(std::size_t x); Color c = red; ... if (c < 14.5) { auto factors = primeFactors(c);// 컴파일 된다 ... } 범위 있는 enum(.. 2020. 7. 2. typedef보다 별칭 선언 typedef std::unique_ptr UPtrMapSS;// C++98 using UPtrMapSS = std::unique_ptr;// C++11 typedef와 별칭 선언이 하는 일은 동일하다. 먼저, 함수 포인터가 관여하는 형식을 다룰 때는 별칭 선언 쪽을 더 쉽게 하는사람들이 많다. // FP는 int 하나와 const std::string& 하나를 받고 아무것도 돌려주지 않는 함수와 동의어이다. typedef void (*FP)(int, const std::string&);// typedef using FP = void (*)(int, const std::string&);// 별칭 선언 2, 3열은 동일한 의미이다. 하지만 사실 둘다 어려운건 마찬가지다. 별칭 선언이 강력한 이유는 템플릿에.. 2020. 7. 1. 0과 NULL 보다 nullptr 리터럴 0은 int이며 포인터가 아니다. 또한 NULL도 포인터 형식이 아니다. C++98에서 0이나 NULL로 중복 적재 함수를 호출했을 때, 포인터를 받는 중복적재가 호출되는 일은 없다. void f(int); void f(bool); void f(void*); f(0);// f(void*)가 아닌 f(int) 호출 f(NULL);// 컴파일 되지 않을 수도 있지만, 보통은 f(int)호출 f(NULL)의 행동에 관련된 불확실성은 NULL의ㅏ 구체적인 형식을 구현의 재량에 맡긴 결과이다. 여기서 주목할 점은, 소스 코드의 외관상 의미(NULL, 즉 널 포인터로 f를 호출한다)와 실제 의미(널 포인터가 아닌 어떤 정수로 f를 호출한다)가 서로 모순된다는 것이다. nullptr의 장점은 정수 형식이 아니.. 2020. 6. 30. 객체 생성시 괄호와 중괄호의 구분 C++에서는 초기화 값을 괄호, 등호, 중괄호로 지정할 수 있고 등호와 중괄호를 함께 사용할 수 있는 경우도 많다. int x(0);// 초기치를 괄호로 감싼 예 int y = 0;// 초기치를 "=" 다음에 지정한 예 int z{ 0 };// 초기치를 중괄호로 감싼 예 int t = { 0 };// "="와 중괄호로 초기치를 지정한 예 대체로 C++은 등호와 중괄호 구문은 중괄호만 사용한 구문과 동일하게 취급한다. int같은 내장 형식에서 초기화와 배정은 학술정긴 차원에서만 차이가 나지만 사용자 정의 형식에서는 초기화와 배정이 각자 다른 함수들을 호출하기 때문에 둘을 구분해야 한다. Widget w1;// 기본 생성자를 호출 Widget w2 = w1;// 배정이 아님, 복사 생성자를 호출 w1 = w.. 2020. 6. 29. 이전 1 2 3 4 5 다음