본문 바로가기

전체 글57

항목 26. 변수 정의는 늦출 수 잇는 데까지 늦추는 근성을 발휘하자 생성자 or 소멸자 호출 타입으로 변수정의시 비용발생한다. 쓰지도 않는데 비용이 발생하면 낭비이다. * 예시 string encryptPassword(const string& password) { string encrypted; // 생성자 호출 비용이 발생하는 타입의 변수 if(password.length() < MinimumPasswordLength) { throw logic_error("password is too short"); } … // encrypted 변수를 사용하는 부분, 하지만 위에서 예외발생시 encrypted변수는 쓰이지 않으며, 비용만 발생한다. return encrypted; } * 개선된 코드 string encryptPassword(const string& password) .. 2020. 1. 15.
항목 25. 예외를 던지지 않는 swap에 대한 지원도 생각해보자 1. std의 표준 swap namespace std { template void swap(T& a, T& b) { T temp(a); a = b; b = temp; //3번의 복사 } } *풀이 - 표준 swap은 타입에 상관없이 1번 호출에 3번 복사가 일어난다. 2-1. 비효율적인 swap동작 예시 ( Class Type ) class WidgetImple { public : … private : int a, b, c; std::vector v; … }; class Widget{ public : Widget(const Widget& rhs); Widget& operator = (const Widget& rhs) { … *pImpl = *(rhs.pImpl); … } … private : Widget.. 2020. 1. 13.
항목 24. 타입 변환이 모든 매개변수에 대해 적용되어야 한다면 비멤버 함수를 선언하자 1. 타입변환 예시 이전 내용에서 암시적 타입변환을 지원하는 것은 좋지 않다.라는 내용을 기억할 수 있다. 하지만 가장 흔한 예외 중 하나가 숫자 타입을 만들때이다. class Rational { public : Rational(int numerator = 0, int denominator = 1); //암시적 변환을 위해 explicit을 쓰지 않음 int numerator() const; int denominator() const; private : ... }; *풀이 (1) 유리수 클래스이다. (2) operator * 코드는 클래스 내부에 써주는게 좋을 것 같다는 판단이 나온다. 밑에서 확인해보자. 2. 클래스 내부에 operator * 작성 class Rational { public: … con.. 2020. 1. 10.
항목 23. 멤버함수 보다는 비멤버 비프렌드 함수와 더 가까워지자 class WebBrowser { public: ... void clearCache(); void clearHistory(); void removeCookies(); ... }; class WebBrowser {//멤버 함수 public : ... void clearEverything(); // clearCache, History, Cookies를 클리어합니다. ... }; void clearBrowser(WebBroser& wb) //비멤버 비프렌드 함수 { wb.clearCache(); wb.clearHistory(); wb.removeCookies(); } 1. 비멤버 비프렌드함수가 멤버함수보다 좋은 이유 (1) 캡슐화 측에서 더 좋음 (2) 패키징 유연성 (3) 컴파일 의존도를 낮춤 (4) 확장성.. 2020. 1. 9.
항목 22. 데이터 멤버가 선언될 곳은 private 영역임을 명심하자 1. 데이터멤버를 private으로 선언해야 하는이유 (1) 문법적 일관성 : 함수로만 데이터 멤버 접근시, 괄호를 쓸지 말지 고민할 필요가없다. (2) 세밀한 접근 제어 : 접근 권한을 세밀하게 컨트롤 가능하다. (3) 캡슐화 : 데이터 멤버를 캡슐화하면 구현상의 융통성을 전부 누릴 수 있다. ex. 내부 데이터 접근시 카운팅, 다른객체에 메시지 전달, 알람 팝업 등.. 2. public과 protected (1) public : 캡슐화 되지 않았다 = 바꿀수 없다. - 만약 데이터멤버를 public으로 선언해놓고 여러 외부 클래스에서 이 데이터를 사용중이다. 만약 이 데이터를 삭제할 일이생긴다면 ?... 고칠 것이 너무 많을 것이다. (2) protected : 마찬가지로 데이터를 삭제할 일이 생겼다.. 2020. 1. 9.
항목 21. 함수에서 객체를 반환해야 할 경우에 참조자를 반환하려고 들지 말자 1. 개요 항목 20.에서 "값에 의한 전달"의 비효율성을 확인했고, 대체로 reference반환의 효율성이 좋아 객체반환을 reference로 했다. 하지만 포인터든 참조자든 결국 원본이 있어야 한다. 미리 결론을 말하자면, 객체를 참조자로 반환하면 안된다! class Rational { public : Rational(int numerator = 0 , int denominator = 1); … private : int n, d; friend const Rational& operator* (const Rational& lhs, const Rational& rhs); //반환값이 const인 이유는… 3장 참조 (ex. i+j = 5) }; * 풀이 - 참조자로 객체를 반환하는 oeprator * 함수.. 2020. 1. 8.