26
Effective C++ -2- 채채

Effective c++ 2

Embed Size (px)

DESCRIPTION

Effective C++ -2-

Citation preview

Page 1: Effective c++ 2

Effective C++-2-

채원

Page 2: Effective c++ 2

3. 자원관리

자원은 썼으면 반환하는 것이 원칙->C++ 의 생성자 , 소멸자 , 객체 복사 함수를 이용하면 편하다

Page 3: Effective c++ 2

항목 13: 자원관리에는 객체가 그만

auto_ptr[ 스마트 포인터 ] 는 가리키는 객체가 소멸할 때 자동으로 delete 를 불러준다 .-> 한 객체를 가리키는 auto_ptr 은 반드시 하나여야 한다 . 복사하면 이전의 것은 null 을 가리킨다 .

auto_ptr 을 사용할 수 없을 때는 RCSP[ 참조 카운팅 방식 스마트 포인터 ] 를 사용한다 .

Page 4: Effective c++ 2

항목 13: 자원관리에는 객체가 그만

RCSP 의 대표적인 예 : std::tr1::shared_ptr<>

특정한 자원을 참조하는 외부 객체의 수를 가지고 있다가 0이되면 해당 자원을 삭제한다

Page 5: Effective c++ 2

항목 13: 자원관리에는 객체가 그만

둘다 소멸자 내부에서 delete 를 작동시킨다 -> 동적 배열에 사용하면 난감 ! -> vector 나 string 으로 대체

정 쓰고싶으면 부스트를 쓰자 .

Page 6: Effective c++ 2

항목 14: 자원관리 클래스의 복사동작에 대해 진지하게 고찰하자

힙에 생기지 않는 자원 관리는 ? Bb

-> 자원 관리 클래스를 직접 만들어야 할 수도 있다 ex) mu-tex : 락을 걸면 반드시 풀어준다

-> RAII 방식을 따라 생성자에서 자원을 획득하고 , 소멸자에서 그 자원을 해제한다

Page 7: Effective c++ 2

항목 14: 자원관리 클래스의 복사동작에 대해 진지하게 고찰하자

RAII 객체를 복사할 때 어쩌지 ?

-> 복사를 금지한다-> 관리하고 있는 자원에 참조 카운팅을 한다 : shared_ptr 을 이용한다 . 대신 삭제자 [ 참조 카운트가 0 이 되었을 때 호출되는 ] 를 지정해줄 수 있다 . Tr1::shared_ptr 생성자의 두번째 매개변수로 넣어줄 수 있다 . 이제 그 클래스는 소멸자를 선언하지 않고 컴파일러가 자동으로 만들어주는 소멸자로 동작한다 .

Page 8: Effective c++ 2

항목 14: 자원관리 클래스의 복사동작에 대해 진지하게 고찰하자

RAII 객체를 복사할 때 어쩌지 ?

-> 관리하는 객체를 진짜로 복사한다 . 그 객체가 관리하는 자원까지 deep 하게 복사한다 새로운 힙 메모리를 갖게됨-> 관리하고 있는 자원의 소유권을 옮긴다 . Ex: auto_ptr

Page 9: Effective c++ 2

항목 15: 자원관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자

RAII 클래스의 객체를 그 객체가 감싸고 있는 실제 자원으로 변환할 방법이 필요

-> 명시적 변환 : get() :RAII 안의 자원의 포인터를 얻을 수 있다-> 암시적 변환 : -> 와 * 의 연산자 오버로딩 ! 암시적 변환 함수를 직접 제공하도록 만든다

Page 10: Effective c++ 2

항목 15: 자원관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자

원하지 않는 타입 변환이 일어나기 쉬우니 , get 과 같은 명시적 함수 변환을 제공하는 것이 낫다 .

캡슐화 : shared_ptr 은 참조 카운팅 메커니즘 관련은 꼼꼼히 캡슐화 하되 , 자신이 관리하는 포인터에 접근할 수 있도록 느긋한 캡슐화 !

Page 11: Effective c++ 2

항목 16:new 및 delete 를 사용할 때는 형태를 반드시 맞추자

new 에 [] 를 썼으면 delete 에도 [] 를 쓰고 , new 에 [] 를 안썼으면 delete 에도 [] 를 쓰지말자

Page 12: Effective c++ 2

항목 17: new 로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자

컴파일러 순서는 보장되있지 않기 때문에 , 예외가 발생하면 디버깅하기 힘든 자원 누수가 발생한다 .

Page 13: Effective c++ 2

4. 설계 및 선언

좋은 인터페이스 설계를 위해서는 !

Page 14: Effective c++ 2

항목 18: 인터페이스 설계는 제대로 쓰기엔 쉽게 , 엉터리로 쓰기엔 어렵게 하자

제대로 쓰기 쉽게 , 엉터리로 쓰기 어렵도록 매개변수 타입을 만들어주면 좋다 .

인터페이스 사이의 일관성을 맞춰준다

기본 제공 타입과의 호환성을 유지한다 .

자원 관리는 기본적으로 지원한다 .

Page 15: Effective c++ 2

항목 19: 클래스 설계는 타입 설계와 똑같이 취급하자

Page 16: Effective c++ 2

항목 19: 클래스 설계는 타입 설계와 똑같이 취급하자

Page 17: Effective c++ 2

항목 19: 클래스 설계는 타입 설계와 똑같이 취급하자

Page 18: Effective c++ 2

항목 19: 클래스 설계는 타입 설계와 똑같이 취급하자

Page 19: Effective c++ 2

항목 19: 클래스 설계는 타입 설계와 똑같이 취급하자

Page 20: Effective c++ 2

항목 20:’ 값에 의한 전달’보다는 ‘상수객체 참조자에 의한 전달’ 방식을 택하는 편이 대개 낫다

말 그대로 값에 의한 전달은 별로다 .상수 객체 참조자에 의한 전달 방식을 택하자 .-> 대신 기본제공 타입 , STL 반복자 , 함수객체 타입에는 맞지 않다 .

Page 21: Effective c++ 2

항목 21: 함수에서 객체를 반환해야 할 경우에 참조자를 반환하려고 들지 말자

포인터나 참조자는 반환하는 물건이 아닙니다 .하지마세요 .

Page 22: Effective c++ 2

항목 22: 데이터 멤버가 선언될 곳은 private 영역임을 명심하자

데이터 멤버는 private 영역에 선언합니다 .protected 는 괜찮아 보이지만 결국 public 과 다를 바 없어요 .

Page 23: Effective c++ 2

항목 23: 멤버 함수보다는 비멤버 비프렌드 함수와 더 가까워지자

컴파일 의존도도 낮추고 객체 확장성이 커집니다 .

다른 클래스의 private 에 접근 가능한 함수의 개수를 늘리지 않으므로 캡슐화 짱짱맨 !

Page 24: Effective c++ 2

항목 23: 멤버 함수보다는 비멤버 비프렌드 함수와 더 가까워지자

헤더 안에 몰아서 네임스페이스로 묶자 -> 다른 요소의 컴파일 의존도를 낮춥니다 !

편의 함수 전체를 여러 개의 헤더 파일에 , 대신 하나의 네임스페이스에 넣으면 함수집합 확장도 쉬워져요

Page 25: Effective c++ 2

항목 24: 타입 변환이 모든 매개변수에 대해 적용되어야 한다면 비멤버 함수를 선언하자

비멤버 함수를 사랑합시다 .어떤 함수의 매개변수가 타입 변환을 필요로 한다면 , 비멤버 함수로 선언하는게 맞아요 .

멤버함수의 반댓말은 프렌드 함수가 아니라 비멤버 함수죠 !

Page 26: Effective c++ 2

항목 25: 예외를 던지지 않는 swap 에 대한 지원도 생각해 보자

내가 만든 타입에 대해 swap 멤버 함수를 제공해요 ! 예외는 던지지 말고요 .멤버 swap 이랑 비멤버 swap 같이 제공해요 .

std 는 마소 형님들 꺼니까 맘대로 추가하지 마세요 !