프로그래밍/Effective C++(35)
-
자기대입 처리(effective c++ 11)
자기대입(self assignment)어떤 객체가 자기 자신에 대해 대입 연산자를 적용하는 것프로그램 작성 중에 자기 자신이 대입되지 않는다는 보장이 없다. 문제점해당 코드에서 operator에 자신이 other에 들어오게 되면?자기 자신인지 모르고 해제해버리고 나중에 이 값을 참조하게 되는 현상이 생길 수 있다. 일치성 검사기법현재 this와 other가 일치한지를 검사한다. 예외에 안전한 기법애초에 예외가 일어나지 않게 코드의 순서를 바꿔 자기대입으로 인한 문제를 방지한다. 복사 후 맞바꾸기임시객체를 만들어 swap하는 방식.
2015.08.07 -
대입 연산자 *this 반환(effective c++ 10)
설명대입연산은 우측연관(right – associative) 연산이라는 특성을 가지고 있다.이는 대입에 대한연산이 여러 개가 엮이더라도 순차적인 대입이 일어나는 것에 대한 원리를 좌변인자의 참조자가 반환되는 것으로 보는데, 이러한 대입 연산자에 대한 규약은 모든 대입연산자에 대해 지켜져야 한다. 대입연산에 대한 처리는 좌변의 참조자를 반환하는 원리로, 모든 대입연산에 대한 처리를 한다. 일반타입이 아닌 기본타입에 대해서도 물론 처리를 해주도록 한다.
2015.08.07 -
객체 생성과 소멸에 가상함수 호출하지 않기(effective c++ 09)
객체가 생성 시기본 클래스 생성자는 파생 클래스 생성자 보다 앞서서 실행되기 때문에, 기본 클래스 생성자가 동작할 시점에 파생 클래스 데이터 멤버는 아직 초기화된 상태가 아니다. 문제점파생 클래스의 객체가 생성 될 때 부모 클래스의 생성자로 먼저 올라가고 부모 클래스의 생성자에서 가상 함수를 호출할 경우 파생 클래스의 객체는 생성 시 기본 클래스의 타입이므로 기본 클래스의 가상 함수를 호출 하게 된다.호출되는 가상 함수는 모두 기본 클래스의 함수들로 결정될 뿐만 아니라 런타임 타입 정보를 사용하는 언어 요소일 경우에도 마찬가지로 기본 클래스의 타입으로 판별된다.기본 클래스의 생성자에서 어쩌다 호출된 가상 함수가 파생 클래스 쪽으로 내려가게 되면 아직 생성이 완료되지 않은 파생 클래스의 데이터를 건드리게 ..
2015.08.02 -
소멸자와 예외처리(effective c++ 08)
소멸자에서의 예외소멸자에서 자원을 해제하는 내용에 예외가 생겼을 때 처리하지 못하고 종료되면 이 예외는 메모리 릭이나 미정의 동작을 일으킬 수 있다. 방안1. 프로그램 종료예외가 생기면 프로그램을 바로 종료한다. (일반적으로 abort를 사용)예외 이후에 프로그램을 계속 실행했을 때 문제가 크게 생기는 경우에고려할 만한 선택이다. 방안2. 에외를 무시하고 계속 진행예외가 생기면 무시하고 그냥 진행한다.무엇이 잘못되었는지에 대한 정보를 알수없어 일반적으로는 좋은 선택이 아니나예외를 무시해도 신뢰성 있게 진행할 수 있는 상황이면 고려할 수도 있다. 방안3. 사용자에게 위임close함수를 직접 제공하여 사용자가 직접 처리할 수 있는 기회를 제공한다. 결론소멸자에서는 예외가 빠져나가면 안된다.모두 받아낸 다음 ..
2015.08.02 -
다형성 가진 기본 클래스의 가상 소멸자(effective c++ 07)
비가상 소멸자상속 관계에서 소멸자에 virtual 키워드를 붙이지 않게 되면 의도치 않은 결과가 나오게 된다. 문제점파생 클래스 객체에 대한 포인터가 가리키는 객체가 삭제될 때는 기본 클래스 포인터를 통해 삭제된다.C++의 규정에 의하면, 기본 클래스 포인터를 통해 파생 클래스 객체가 삭제될 때 그 기본 클래스에 비가상 소멸자가 들어 있으면 프로그램 동작은 미정의 사항이다.대개 그 객체의 파생 클래스 부분이 소멸되지 않게 된다.기본 클래스 부분은 소멸 과정이 일어나고 파생 클래스는 소멸이 일어나지 않기 때문에 부분 소멸(partially destroyed) 객체가 된다. 무조건 virtual을 붙이면 안된다.클래스 내부에 가상 함수가 하나도 없는 클래스의 소멸자를 virtual로 선언하면 용량의 낭비가 ..
2015.08.02 -
참조자 전달 선호하기(effective c++ 20)
값에 의한 전달객체전달객체를 값으로 전달하면 생성자와 소멸자를 반복적으로 호출하여 매우 비효율적이다. 객체손실Derived Class의 객체를 Base Class의 객체로 인자를 전달하는 경우, Derived Class 객체의 특징이 잘려버리는 것. 상수객체에 대한 참조자(reference-to-const)로 전달하게 만드는 것이다. 무조건 참조자에 의한 전달이 좋은가?기본 제공 타입기본제공 타입에 대해서는 ‘값에 의한 전달’을 선택하더라도 엉터리가 아니고 더 효율 적일때가 많다. STL과 함수객체STL의 반복자와 함수 객체는 값으로 전달하는 것이 효율 적이다. (예전부터 반복자와 함수 객체는 값으로 전달이 효율적인 구조로 설계되어있다.) 반복자와 함수 객체 구현 원칙복사 효율을 높일 것.복사손실 문제에..
2015.07.28