전체 글124 Effective C++ | 항목 52 placement new를 작성한다면 placement delete도 작성하자 항목 52 placement new를 작성한다면 placement delete도 작성하자52.1 placement new■ 52.1.1 placement newplacement new란 다른 매개변수를 추가로 전달하는 operator new 함수를 말한다. 헤더 파일을 포함하면 void* 포인터를 추가로 받는 표준 placement new를 사용할 수 있다.// 어떤 객체를 생성할 메모리 위치를 나타내는 포인터를 매개변수로 받는 placement new입니다.// C++ 표준 라이브러리에 정의되어 있습니다.void* operator new(std::size_t _iSize, void* _pMemory) throw(); ■ 52.1.2 placement new 예외 처리// 기본 operator newvo.. 2024. 8. 8. Effective C++ | 항목 43 템플릿으로 만들어진 부모 클래스 안의 이름에 접근하는 방법을 알아두자 항목 43 템플릿으로 만들어진 부모 클래스 안의 이름에 접근하는 방법을 알아두자43.1 부모 클래스 템플릿부모 템플릿 클래스를 상속받은 자식 클래스에서 부모 클래스에 있는 함수를 호출할 수 없다.T가 템플릿 매개변수이므로 인스턴스화하기 전까지 MsgSender 클래스가 어떤 형태인지 알 수 없다.즉, SendRaw 함수가 MsgSender에 있는지 알 수 없으므로 컴파일 오류가 발생한다.class CompanyA{public: void SendRawText(const std::string& _strMsg) { ... } void SendEncryptedText(const std::string& _strMsg) { ... }};class CompanyZ{public: void SendEncryptedTex.. 2024. 8. 6. Effective C++ | 항목 42 typename의 두 가지 의미를 제대로 파악하자 항목 42 typename의 두 가지 의미를 파악하자 42.1 class vs. typename■ 42.1.1 템플릿 타입 매개변수템플릿 매개변수를 선언하는 경우, class와 typename은 완전히 같다.templateclass CBase;templateclass CBase; ■ 42.1.2 중첩된 의존 이름의존 이름템플릿 안에 있는 이름 중에 템플릿 매개변수에 의존적인 이름을 의존 이름(dependent name)이라고 한다.클래스 안에 중첩되어 있는 의존 이름을 중첩된 의존 이름(nested dependent name)이라고 한다.T::iterator, T::const_iterator비의존 이름템플릿 매개변수와 관계없는 이름을 비의존 이름(non-dependent name)이라고 한다.int, f.. 2024. 8. 6. Effective C++ | 항목 41 템플릿 프로그래밍은 암시적 인터페이스와 컴파일 시간 다형성부터 항목 41 템플릿 프로그래밍은 암시적 인터페이스와 컴파일 타임 다형성부터41.1 명시적 인터페이스와 런 타임 다형성소스 코드에 명시적으로 드러나는 인터페이스를 명시적 인터페이스(explicit interface)라고 한다.명시적 인터페이스는 함수의 시그니처(signature)로 구성된다.함수의 시그니처란 함수의 이름, 매개변수 타입, 반환 타입을 통틀어 부르는 말이다.가상 함수는 동적인 타입을 기반으로 프로그램이 실행되는 중, 즉 런 타임 다형성(runtime polymorphism)에 의해 호출된다.class Widget{public: Widget(); virtual ~Widget();public: virtual size_t size() const; virtual void normalize(); voi.. 2024. 8. 6. Effective C++ | 항목 40 다중 상속은 심사숙고해서 사용하자 항목 40 다중 상속은 심사숙고해서 사용하자40.1 다중 상속의 단점■ 40.1.1 다중 상속의 단점: 모호성다중 상속은 여러 부모 클래스에서 똑같은 이름을 받는 경우, 모호성이 생긴다.C++는 최적으로 일치(best match)하는 함수를 먼저 찾고 그 함수의 접근 가능성을 확인한다.따라서 멤버의 접근 제한자가 달라도 이름이 같으면 모호성이 발생한다. ■ 40.1.2 다중 상속의 단점: 데이터 멤버다중 상속은 상위에 있는 여러 기본 클래스를 갖는 클래스 계통에서 발견된다. 죽음의 다이아몬드(deadly diamond) 모양이 나타날 수 있다.C++는 기본적으로 데이터 멤버를 중복으로 생성한다.단, 가상 기본 클래스를 가상 상속(virtual inheritance)하는 경우 데이터 멤버를 중복으로 생성하.. 2024. 8. 6. Effective C++ | 항목 39 private 상속은 심사숙고해서 구사하자 항목 39 private 상속은 심사숙고해서 구사하자39.1 public 상속 vs. private 상속■ 39.1.1 public 상속과 private 상속의 차이점public 상속is-a 관계를 의미한다.자식 클래스 타입이 부모 클래스 타입으로 암시적으로 변환된다.private 상속is-implemented-in-terms-of 관계를 의미한다. 즉, 소프트웨어 구현 영역으로서 의미만 있다.자식 클래스 타입이 부모 클래스 타입으로 암시적으로 변환되지 않는다.부모 클래스에 있는 접근 제한자가 private으로 변경된다. 39.2 private 상속 vs. 객체 합성■ 39.2.1 private 상속과 객체 합성의 차이점is-implemented-in-terms-of를 구현할 때, 객체 합성을 사용한다... 2024. 8. 6. Effective C++ | 항목 38 has-a 혹은 is-implemented-in-terms-of를 모형화할 때는 객체 합성을 사용하자 항목 38 has-a 혹은 is-implemented-in-terms-of를 모형화할 때는 객체 합성을 사용하자 38.1 객체 합성합성(composition)어떤 타입의 객체가 다른 타입의 객체를 포함하고 있을 때, 두 타입 사이의 관계를 일컫는다.계층(layering), 포함(containment), 통합(aggregation), 혹은 내장(embedding)과 동의어이다. 38.2 객체 합성의 의미■ 38.2.1 응용 영역과 has-a소프트웨어 응용 영역(application domain)사람, 이동 수단 등 일상생활에서 볼 수 있는 사물을 본뜬 객체가 속한 영역을 말한다.객체 합성이 응용 영역에서 일어나면 has-a 관계를 갖는다.class Address { ... };class PhoneNumbe.. 2024. 8. 6. Effective C++ | 항목 37 어떤 함수에 대해서도 상속받은 디폴트 인수는 절대로 재정의하지 말자 항목 37 어떤 함수에 대해서도 상속받은 디폴트 인수를 재정의하지 말자 37.1 정적 바인딩과 동적 바인딩가상 함수는 동적 바인딩(dynamic bind)된다.가상 함수는 호출한 객체의 동적 타입(dynamic type)에 따라 어떤 함수를 호출할지 결정된다.객체의 동적 타입이란, 현재 그 객체가 무엇인지에 따라 결정되는 타입을 말한다.디폴트 인수는 정적 바인딩(static bind)된다.디폴트 인수는 객체의 정적 타입(static type)에 따라 어떤 디폴트 인수를 사용할지 결정된다.객체의 정적 타입이란, 객체를 선언할 때 결정되는 타입을 말한다.class Shape{public: enum ShapeColor { RED, GREEN }; virtual void Draw(ShapeColor shape.. 2024. 7. 26. 컴투스 | 2023 SUMMER 인턴십 GENIUS 5기 | 게임 클라이언트 클라이언트 프로그래머 ◆ 게임 클라이언트 콘텐츠 개발 ◆ 게임 콘텐츠 제작 지원 툴 개발 ◆ 게임 개발/서비스를 위한 신규 기술 R&D 지원자격 및 우대사항 ◆ 컴퓨터공학, 전산, 게임 관련 전공자 분 ◆ C, C++, C# 등의 프로그래밍이 가능하신 분 ◆ 게임개발 또는 기반 연구 관련 관심을 보유하신 분 ◆ 자료구조, 알고리즘, OS, 네트워크, 컴퓨터 그래픽스 등에 대한 지식을 보유하신 분 ◆ 포트폴리오 제출 필수 (상세 가이드는 지원서 내 확인 가능) 2023. 5. 26. Effective C++ | 항목 36 상속받은 비가상 함수를 자식 클래스에서 재정의하는 것은 절대 금물! 항목 36 상속받은 비가상 함수를 자식 클래스에서 재정의하지 말자 36.1 재정의한 비가상 함수 비가상 함수는 정적 바인딩(static binding)으로 묶인다. pParent는 Parent에 대한 포인터 타입으로 선언되었기 때문에 pParent를 통해 호출되는 비가상 함수는 항상 Parent 클래스에 정의되어 있다고 결정한다. 가상 함수는 동적 바인딩(dynamic binding)으로 묶인다. mf 함수가 가상 함수였다면 pParent와 pChild가 가리키는 대상은 Child 타입의 객체이므로 무조건 Child::mf()가 호출된다. 비가상 함수를 재정의하면 객체를 가리키는 포인터나 참조자 타입에 따라 일관성 없는 동작을 보이므로 상속받은 비가상 함수를 재정의하면 안 된다. class Parent .. 2023. 5. 21. Effective C++ | 항목 34 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구분하자 항목 34 인터페이스 상속과 구현 상속의 차이를 파악하고 구분하자 34.1 인터페이스 상속과 구현 상속 멤버 함수 인터페이스 상속 함수 인터페이스 상속은 함수 선언을 물려주는 것과 같다. 부모 클래스의 멤버 함수 인터페이스는 is-a 관계에 의하여 항상 자식 클래스에게 물려준다. 멤버 함수 구현 상속 함수 구현 상속은 함수 정의를 물려주는 것과 같다. 부모 클래스의 멤버 함수 구현은 멤버 함수의 세 가지 유형에 따라서 다르게 물려준다. 상속 순수 가상 함수 가상 함수 비가상 함수 인터페이스 상속 O O O 구현 상속 X △ O ■ 34.1.1 순수 가상 함수 순수 가상 함수(pure virtual function)는 자식 클래스에게 함수의 인터페이스만 물려준다. 일반적으로 부모 클래스에 있는 순수 가상 .. 2023. 5. 21. Effective C++ | 항목 33 상속된 이름을 숨기는 일은 피하자 항목 33 상속된 이름을 숨기는 일은 피하자 33.1 유효 범위 함수 유효 범위 컴파일러는 함수에서 지역 유효 범위 → 전역 유효 범위 순으로 변수의 이름을 찾는다. 타입과 상관없이 이름이 같은 변수를 찾는다. int x; void Function() { // 지역 변수 double의 이름 x가 전역 변수 int의 이름 x를 가립니다. double x; cin >> x; } 클래스 유효 범위 컴파일러는 클래스에서 지역 유효 범위 → 자식 클래스 유효 범위 → 부모 클래스 유효 범위 → 전역 유효 범위 순으로 함수 혹은 변수의 이름을 찾는다. 함수 혹은 변수의 반환 타입, 매개변수 타입과 상관없이 이름이 같은 함수 혹은 변수를 찾는다. class Parent { private: public: // 순수 가.. 2023. 5. 20. 이전 1 2 3 4 ··· 11 다음