항목 3 : 낌새만 보이면 const를 들이대 보자! const그냥 왠만하면 다 걸어버리자 포이터에도 걸고 함수에도 걸고 그리고 코드중복을 제거하자
항목 4 : 객체를 사용하기 전에 반드시 그 객체를 초기화하자 말 그대로 쓰기전에 초기화해야한다. 그리고 string같은 클래스나 클래스안의 데이터들은 왠만하면 생성자의 멤버 초기화 리스트를 사용하자.
Chapter 2 생성자, 소멸자 및 대입 연산자
항목 5 : c++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 우리가 클래스에 생성자,복사생성자, 복사대입연산자를 따로 선언을 하지않으면 컴파일러가 자동으로 만듬. 필요없으면 delete로 없버리리자 그리고 일반 생성자는 어떤 생성자가 선언이 되있기만하면 자동으로 생기지 않지만 복사생성자와 복사대입연산자 그딴거 없고 그냥 생긴다. 그리고 클래스데이터에 참조가있으면 복사할때 조심해야한다. 이유는 한번 참조하면 그 참조주소는 바꿀수가 없기때문!
항목 6 : 컴파일러가 만들어낸 함수가 필요없으면 확실히 이들의 사용을 금해 버리자 컴파일러가 자동으로 만드는 기본생성자, 복사생성자, 복사대입연산자 중에서 필요없는것이 있다면 delete로 없에버리자
항목 7 : 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자 안그러면 서해안 기름 유출되듯이 자원질질샘 virtual ~deleter(){} 꼭 하자
항목 8 : 예외가 소멸자를 떠나지 못하도록 붙들어 놓자 소멸자에서 try,catch문을 사용하여 예외가 못 빠져나가게 하자, 그리고 사용자에게 에러를 처리할 기회를 주자
항목 9 : 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자 vfptr의 동작방식을 이해하고있으면 절대로 하면 안된다 구지 생성자에서 기본 클래스에 값을 올리고 싶으면 일반 함수를 이용하여 올려주면 된다. 예시 -> TEST2 () : TEST1(Return_Integer(5))
항목 10 : 대입 연산자는 *this의 참조자를 반환하게 하자 그냥 관례란다. 지키자
항목 11 : operator=에서는 자기 대입에 대한 처리가 빠지지 않도록 하자 operator=을 구현할 때 자기대입에 대한 대처를 해놓자(코드의 순서로 예외에 대비해도되고, 복사 대입으로 해도되고)
항목 12 : 객체의 모든 부분을 빠짐없이 복사하자 기본 클래스의 복사도 생각하자
항목 13 : 자원관리에는 객체가 그만! 스마트 포인터 잘 사용하자
항목 14 : 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자 자원을 관리하는 클래스는 왠만해서느 복사를 시켜주지말고 shared_ptr의 삭제자도 잘 활용해보자
항목 15 : 자원 관리 클래스에서 관리되는 자원은 위부에서 접근할 수 있도록 하자 캡슐링도 중요하지만 외부에서 자주쓰는 자원들은 제공해주자 하지만 구지 보여주지않을것까지 보여줄 필요는없다.
항목 16 : new및 delete를 사용할 때는 형태를 반드시 맞추자 객체 하나인거랑 배열인거랑 delete의 형태가 다르니 조심하자 그리고 스마트포인터에서는 배열을 조심해서 쓰자
항목 17 : new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자. 연산순서에 따른 예외처리도 생각해놔야해
Chapter 5 구현
항목 29 : 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자! 순서 잘 지키고 예외를 생각하자. 그리고 중요하다고 생각하는 곳에는 copy-and-swap을 사용해보자