지연평가와 선행평가에 대해서 어느정도 감이 오는 사람이라면, 아주 손쉽게 이해되는 장이다. 변수 정의를 늦출수 있게 된것은 C++의 어디에서건 변수를 선언 할수 있게 만들어 줌으로써 생겨난 방법일것이다. 왜 늦출 수 있는 데까지 늦추어야 하는가? 가장 큰 이유는 변수의 생성 대입 초기화 라는 작업이, 일어날 필요가 없게 될 경우가 생기기 때문이다. 예를 들어서, 아주 큰 객체를 생성하여 대입하고 하고, 특정 함수를 작업하고, 다시 선언된 큰 객체를 사용하고 날려 버리는 작업이 있다고 했을때, 특정 함수에서 .. 오류가 나서, 이 이 객체를 쓰지도 못하게 되었다고 친다면, ... 이해가 쉽게 갈것이다. { string encrypted; if(password.lengh() < MinimumPasswordL..
책 정리/Effective C++ 3판 검색 결과
swap 함수는 무엇일까? .. 뭐 다들 알겠고, 중요한건 이 함수를 이용하여, "교체" 를 할수 있다는것이다. 왜 이 함수가 중요한것인가? STL에 이 함수가 포함된 이래, 예외 안전성 프로그래밍에선 없어선 안 될 감초 역활로써, 자기 대입 현상의 가능성에 대처하기 위한 대표적인 매커니즘으로서 널리 사랑받아 왔다다고 저자는 설명한다; 이쁘면 얼굴값 한다고, 이 swap 함수에도 말들이 많다. 그것은 바로 효율 때문이다. 기본적으로 복사하는데에 대한 비용은 지불해야 겠지만, 지불하지 않아도 되는 경우가 있기 때문인데, 그것이 바로 다른 타입의 실제 데이터를 가리키는 포인터가 주성분인 타입의 객체(pimpl(pointer to implementation))의 swap 이다! 어떻게 하면, 이런 객체 전용의..
이게 무슨 말인가? 타입 변환이 되는 경우를 생각해 보면 1. 함수의 매개변수에 넣는 인자가 암시적으로 타입 변환되는 경우 2. 기본형 변수 중 서로 다른 형을 같이 연산하고자 할때 그런데 이게 모든 매개변수에 대해 적용되어야 한다면?? 여기서 모든 매개변수란 함수의 인자가 매개변수로 넘어갈때 모든 매개변수에 대해 타입 변환이 일어나게 할려면 이라는 뜻 같은데, 실제 코딩에선 많이 필요로 하지 않았지만, 책을 보면, 유리수 연산을 그 예로 들고 있다. 뭐, 이건 사용자가 어떻게 변하는지 안다면 다른 형에 대해서도 쓸수 을듯(.. 이것을 모르면, 암시적 타입 변환의 예 를 찾아 보는게 좋겠다) 비멤버 함수로 선언해라? 아... 여기서 눈치 챈 사람도 많겠지만, 풀어 버린다면, 멤버 함수로 넣게 되면, 자기..
아아, 이해하는데 시간 걸렸다. friend 함수를 사용하라는게 아니라 비멤버 비프렌드 함수를 이용하라는 뜻이다! 자, 왜 비멤버 비프렌드 함수와 가까워져야 할까? 우선 이 말은, 클래스 공개 내부 멤버함수를 조합하는 편의 함수에게만 적용된다.. 이 함수는 클래스 내부에 접근할수가 없고, 1. 무조건 클래스의 멤버 함수만을 이용해야 하며, 2. 멤버 함수를 이용하기 위해서는 매개체인 객체가 항상 필요하기 때문이다. 즉, 어디서 호출되는지 한눈에 파악할수 있으며, 수정 구역도 한정되기 때문이다. 이것으로 구체적인 장점은 무엇이 있을까? 첫째, 캡슐화를 더 강화 할수 있다 왜냐하면, private 멤버 데이터 접근 함수가 적어지기 때문이다.(많은 수의 private 접근 허용 함수가 있다면, 많은 수의 변경..
private 영역에 넣었다면? private는 클래스 외부에서의 그 어떤 접근도 허용하지 않겠다는 인터페이스이다. 항상 클래스 내부에서만 접근 가능하다. 이 때문에 많은 장점 있겠지만, 대표적으로 엉터리로 쓰기엔 어렵게 만들기 위해서이고, 캡슐화를 위해서이다. 엉터리로 쓰기엔... 이부분은 항목 18에 설명을 했고, 캡술화란 무엇인지는 지겹게 들었을 것이다. 캡슐화 부분만 다시 지적한다면, 객체 내부에 private 영역에 데이터를 넣음으로써 객체간의 혼동과 디버그, 보안 인터페이스를 보다 쉽게 막거나나 혹은 더 쉽게 가능해 지기 때문이다. 이처럼 캡슐화를 하게 되면, 모든 데이터를 함수 인터페이스 뒤에 감추게 되는데, 이때 구현상의 융통성을 전부 누릴 수 도 있다. 예를 들자면, .. 내부 데이터 접..
참조자를 왜 반환해도 되지 않나? 매개변수가 참조자이고, 그 참조자를 반환하는 경우에는 상관이 없다. 하지만, 함수 내부에서 선언된 객체의 경우에는 크게 잘못 된다. 그 이유는 어디에 있나? .. RAII 방식을 이해 했다면 그 이유를 알수 있을 듯 하지만, 설명하자면, 스택에 올라간 객체는 존재 할수 있는 범위(Scope)가 있다. 함수 내부에 선언(스택에 올려진)된 객체의 경우, 함수 종료 후 전기적 쇼크로 날라 간다. 그러므로 안에 있던 객체를 참조자로 리턴하게 되면 큰일난다. 그러면, 생성되고 소멸되는 객체를 어떻게 최적화 시키나? 리턴 타입을 임시객체 형태로 하기만 하면, 컴파일러가 알아서 처리해 준다. 이런 방법은 많은 컴파일러 회사들이 지원하고 있으며, 흔히들 "RVO(return value..
최근댓글