분류 전체보기(599)
-
함수에서 객체 반환시 참조로 X(effective c++ 21)
참조에 의한 전달모든 경우에서 참조에 의한 전달만을 사용하려고 해서는 안 된다. 문제점‘값에 의한 전달’에 숨겨진 효율 문제를 알아챈 후에, 나머지 모든 부분에서 ‘참조에 의한 전달’만을 사용하려 할 경우 문제가 생긴다.실제로 있지도 않은 객체의 참조자를 넘기려는 상황이 올 수도 있다. 새로운 객체를 반환operator*가 참조자를 반환하도록 만들어졌다면, 이 함수가 반환하는 참조자는 반드시 이미 존재하는 Rational 객체의 참조자여야 한다. 문제점참조자는 존재하는 객체에 붙는 ‘또 다른’ 이름이다.반환될 객체에 대한 참조자를 operator*에서 반환할 수 있으려면, 그 객체를 직접 생성해야 한다.함수 수준에서 새로운 객체를 만드는 방법은 2가지이다.( 스택에 생성, 힙에 생성 ) 스택에 만드는 방..
2015.08.23 -
클래스 설계는 타입 설계와 같이 보자(effective c++ 19)
효과적인 클래스 설계객체 지향 프로그래밍 언어와 마찬가지로 C++에서 새로운 클래스를 정의한다는 것은 새로운 타입을 하나 정의하는 것과 같다. 고려 사항문법(syntax)이 자연스럽고 의미구조(semantics)가 직관적이며, 효율적인 구현 클래스 설계에 신경써야 할 부분새로 정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가?- 객체 지향 프로그래밍 언어와 마찬가지로 C++에서 새로운 클래스를 정의한다는 것은 새로운 타입을 하나 정의하는 것과 같다. 객체 초기화는 객체 대입과 어떻게 달라야 하는가?- 생성자와 대입 연산자의 동작 및 둘 사이의 차이점을 결정짓는 요소이다..- 초기화와 대입을 헷갈리지 않는 것이 가장 중요하다. 새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 ..
2015.08.20 -
인터페이스 설계방법. 제대로는 쉽게, 엉터리론 어렵게(effective c++ 18)
인터페이스 설계란클래스의 접근 권한을 이야기 하는 것이 아닌, 사용자와 제품간의 접점을 말한다. 여기서는 클래스나 함수, 템플릿의 사용 환경 등이 속한다. 좋은 설계제대로 쓰기는 쉽게, 잘못 쓰기는 어렵게 설계하는 것이 바람직하다. 일관성을 지키는 설계인터페이스를 만들 때 기존에 제공되던 공통인터페이스를 일관성 있게 따르는 것이 바람직하다. 이는 사용자 측에서 뭔가를 외우지 않고 기존에 하던 대로 편하게 사용 할 수 있으므로 접근성이 높다. (STL, .NET등도 최대한 이와 같이 하려고 노력하였다.) 실수를 방지하는 설계만일 사용자가 인터페이스를 잘못 사용하고 있다면 알기 쉽게 컴파일 에러가 나도록 만든다. 방법1. 새로운 타입을 들여와 인터페이스를 강화한다.2. const의 활용 주의점새로운 타입을 ..
2015.08.20 -
new로 생성한 객체를 스마트포인터에 저장하는 코드는 별도의 한 문장(effective c++ 17)
정리new로 생성한 객체를 스마트 포인터로 넣는 코드는 별도의 한 문장으로 만들자. 이것이 안 되어 있으면, 예외가 발생될 때 디버깅 하기 힘든 자원 누출이 초래될 수 있다. 예제해당 코드의 경우 컴파일이 된다. 문제점함수의 매개변수로 넘겨지는 인자를 평가(evalutate): priority() 호출 ->“new Widget” 표현식 실행 -> shared_ptr 생성자 호출 연산이 호출되는 순서는 컴파일러 제작사마다 다르다.※ 자바 및 C#은 매개변수의 평가 순서가 특정하게 고정되어있다. priority()가 두 번째로 호출 되고 예외가 발생했다면???new Widget은 누수!!! 해결따로!
2015.08.20 -
new/delete 형태 맞추기(effective c++ 16)
정리- new 표현식에 []를 썻으면, 대응되는 delete 표현식에도 []를 써야한다.- new 표현식에 []를 안 썼다면, 대응되는 delete 표현식에도 []를 쓰지말아야 한다.
2015.08.20 -
자원관리 클래스의 자원은 접근 가능하게(effective c++ 15)
형변환을 통한 외부 접근타입 불일치- 실수 없이 자원을 관리하기 위해서는 스마트 포인터를 활용하는 방법이 소개되었다.- 그러나 API 함수를 비롯한 표준 함수들은 원시 포인터(native pointer)를 원한다. 원시 포인터, 스마트 포인터- 원시 포인터int* pa;- 스마트 포인터std::tr1::shared_ptr ps; 형변환 필요성- 스마트 포인터는 해당 타입을 감싸고 있는 하나의 객체로 원시 포인터와는 엄연히 다른 타입이다.- 원시 포인터를 필요로 하는 함수가 있을 경우 이를 형변환해주어야 컴파일 에러를 피할 수 있다. 스마트 포인터get 함수- 해당 타입의 원시 포인터 사본을 반환하는 멤버 함수이다.- auto_ptr과 shared_ptr 모두 사용 가능하다.- 반환값 : 해당 타입의 원시..
2015.08.20