일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- UE4
- 비교 함수 객체
- exception
- 언리얼
- 오블완
- 영화
- operator new
- resource management class
- Smart Pointer
- more effective c++
- 영화 리뷰
- 메타테이블
- implicit conversion
- c++
- 루아
- 스마트 포인터
- reference
- 암시적 변환
- virtual function
- 다형성
- 참조자
- Effective c++
- 반복자
- effective stl
- 상속
- lua
- 티스토리챌린지
- 예외
- 게임
- 함수 객체
- Today
- Total
목록more effective c++ (33)
스토리텔링 개발자
항목 10. 생성자에서는 리소스 누수가 일어나지 않게 하자. 생성자 설계 예제// 이미지 정보 클래스class Image{public: Image(const string& imageDataFileName); ...};// 오디오 정보 클래스class AudioClip{public: AudioClip(const string& audioDataFileName); ...};// 전화번호 클래스class PhoneNumber { ... };// 주소록에 들어가는 하나의 정보에 대한 클래스class BookEntry{public: BookEntry(const string& name, const string& address = "", co..
항목 9 : 리소스 누수를 피하는 방법의 정공은 소멸자이다. 지역 리소스에 대한 포인터지역 리소스(스택에서 생긴 리소스)를 조작할 때, 포인터는 부적절할 수 있다.소멸자가 불리지 않는 상황이 발생할 수 있기 때문이다.즉, 리소스 누수가 발생할 수 있다는 뜻이다.class ALA{public: virtual void processAdoption() = 0; ...};class Puppy : public ALA{public: virtual void processAdoption(); ...};class Kitten : public ALA{public: virtual void processAdoption(); ...};// s로부터 동물 정보를 읽어서// 적절한 타입의 객체를..
항목 8 : new와 delete의 의미를 정확히 구분하고 이해하자 ‘new 연산자’와 ‘operator new’의 차이string* ps = new string("Memory Management"); // new 연산자가 사용되었다.new 연산자C++에서 기본으로 제공한다.sizeof가 그런 것처럼, 동작 원리를 바꾸는 것이 불가능하다.동작 단계요청 타입의 객체를 담을 수 있는 크기의 메모리를 할당한다.(이 동작이 operator new 함수 호출로 동작된다.)객체의 생성자를 호출하여 할당된 메모리의 객체 초기화를 수행한다.operator new객체로 담을 메모리를 할당하는 방법이다.new 연산자는 필수적인 메모리 할당을 위해 operator new를 호출하게 되어 있다. operator new..
항목 7 : &&, ||, 혹은 , 연산자는 오버로딩 대상이 절대로 아니다 단축 평가(short-circuit)C와 마찬가지로 C++ 역시 복합적인 불린 표현식을 평가할 때 단축 평가 처리를 할 수 있다.즉, 표현식의 일부가 참, 거짓임이 판명되면, 그 이후의 표현식은 무시하고 평가를 중단한다.// 1.char* p;// 이 경우, p != 0 이 거짓으로 판명되면 strlen이 호출될 걱정을 할 필요가 없다.// 즉, null 포인터에 대한 strlen 호출이 되지 않음을 가정하고 작성한 코드이다.// null 포인터에 대한 strlen 호출은 미정의 사항이기 때문이다.if((p != 0) && (strlen(p) > 10)){ ... }// 2.int rangeCheck(int index){ ..
항목 5. 사용자 정의 타입 변환 함수에 대한 주의를 놓지 말자 암시적 변환C처럼 C++ 역시 암시적 변환을 지원한다.예컨대 char -> int, short -> double 로 군소리 없이 변환시켜 준다.심지어 int -> short, double -> char 처럼 데이터 손상 여지가 있는 변환도 지원한다.raw 타입에 대해선 어쩔 수 없지만, 커스텀 타입에 대해서는 이 암시적 변환을 확실히 제어할 수 있다.암시적 타입 변환을 위해 컴파일러가 사용할 수 있는 함수를 제공하면 된다. 암시적 타입 변환 함수의 종류 1. 단일 인자 생성자(single-argument constructor)인자를 하나만 받아 호출하는 생성자를 말한다.하나의 매개변수만 받도록 선언.혹은 여러 매개변수이나, 처음 것을..
항목 4 : 쓸데 없는 기본 생성자는 그냥 두지 말자 기본 생성자아무런 인자도 받지 않고 호출될 수 있는 생성자외부 정보를 하나도 받지 않고 초기화를 한다는 의미이다.하지만, 외부 정보 없이는 완전한 초기화를 수행할 수 없는 경우도 있다.예를 들면 주소록의 입력 자료, 회사에서 관리하는 회사 장비의 ID 번호 등.그렇다면 이 경우엔 기본 생성자를 제공하지 않으면 될 것이나... 기본 생성자가 없는 클래스 제작 시 유의사항 세 가지// 아래 예제를 통해서 유의사항을 알아본다.// 회사 장비를 나타내는 클래스class EquipmentPiece{public: EquipmentPiece(int IDNumber); ...} 1. 배열을 생성할 때일반적으로 배열의 요소로 들어가는 객체에 대해..
항목 3 : 배열과 다형성은 같은 수준으로 놓고 볼 것이 아니다. 상속성이 주는 혜택기본 클래스 객체의 포인터나 참조자를 통해 파생 클래스 객체를 조작할 수 있다.즉, 다형성을 가지고 있다.파생 클래스 객체의 배열을 기본 클래스 포인터나 참조자를 통해 조작할 수 있다.하지만, 이게 정말 바랬던 일일까..? 기본 클래스 배열 대신 파생 클래스 배열을 사용하는 경우class BST { ... };class BalancedBST : public BST { ... };void printBSTArray(ostream& s, const BST array[], int numElements){ for(int i = 0 ; i 두 번째 printBSTArray는 미정의 결과이다. 배열과 포인터array[..
항목 2 : 가능한 C++ 스타일의 캐스트를 즐겨 쓰자. C 스타일 캐스트의 문제점타입을 다른 타입으로 제한 없이 바꾸어준다.어떤 객체의 상수성(copnstness)만을 바꾼다.기본 클래스 객체에 대한 포인터를 파생 클래스 객체에 대한 포인터로 바꾼다.위 둘은 전혀 다른 캐스트지만, C 스타일 캐스트는 이 모든 걸 별 말 없이 소화해버리기 때문에 위험하다.C 스타일 캐스트는 눈으로 찾아내기가 힘들다.식별자를 괄호로 둘러싼 것일 뿐이기 때문이다.int firstNumber, secondNumber;...// c 스타일 캐스트double result = ((double)firstNumber) / secondNumber;// c++ 스타일 캐스트// 인간의 눈이나 프로그램이나 발견하기 쉬운 캐스트doubl..