Effective C++_1131043 양현찬
NHN NEXT
C++의 하위언어들
•C
•C with Classes
•Template
•STL
C++의 어떤 부분을 사용하냐에따라 효과적인 규칙이 달라진다.
가급적 선행처리자 보다 컴파일러를 가까이
#define 보다 const, enum, inline을 떠올리자
혹은 파일입출력을 이용한 스크립트 언어 파싱
Const를 사용할 때
• 포인터 사용시 상수포인터를 정의
• 포인터가 가리키는 대상도 상수로 정의
• Const char * const myFavorite = “D-Frag!”;
• Cont std::string myFavoriteChar = “Takao”;
Class에서 상수 멤버 선언과 정의
.h 파일 (선언 부분)
.c++ 파일(정의 부분)
구식 컴파일러 (대표적으로 V양)
표준이 아님! 클래스 내부에서 상수를 사용해야 할 경우 문제가 발생!
Enum의 특징
• Const는 주소값에 접근할 수 있다.
• Enum은 주소값에 접근하는 것은 불법이다.
• 절대 쓸데 없는 메모리 할당이 없다.
• 나열자 둔갑술은 상당히 많이 사용된다.
• 프로그래머는 닌자일지도 모른다.
메크로 함수대신template과 inline
레퍼런스(참조자)를 사용해야 할 때
• 참조하고자 하는 객체를 미리 알고 있을 때
• 다른 객체를 바꾸어 참조할 일이 없을 때
• 포인터를 사용하면 문법상 어색해질 때
Const
•변해서는 안됨을 가시화 시켜줌
•유효범위 상수를 선언
•Static으로 선언한 변수를 보호
•포인터의 경우 값과 주소값을 보호
물리적 상수성
분명 operator[]함수는 pText의 값을 변경하지는 않는다.
하지만 operator 함수로 인해 값이 변경되고 있다!
논리적 상수성
• 뭐 어때 너만 모르면, 난 상수함수다!
캐스팅 안 쓸땐 안 쓰더라도 코드 중복정돈 피해 두 되잖아?
재귀함수를 피하기 위해
비상수 객체를 상수 객체화
일반적으로는 이미 초기화가 이루어진 상태
정적 객체
•프로그램 끝날 때 까지 살아있는 객체
•초기화 순서는 정해져 있지 않다.
어디서 본듯한데? -> 싱글톤!
컴파일러가 거부하는 경우
• 클래스를 구현한 코드가 적합하지 않거나 이치에맞지 않을 경우
• 예를 들면 참조자 멤버가 있는 경우
• 이럴 경우 사용자가 직접 대입연산을 정의 해줘야한다.
컴파일러가 만든 함수의 사용을 금지하고 싶을 때
문제점
팩토리 함수에서 받는 함수는 Timekeeper를 상속받는 파생클래스다.
따라서 할당 받은 메모리를 해제할 때 Timekeeper부분만 해제되고 파생클래스부분은 해제되지
못한 부분해제현상이 생김.
해결
소멸자를 가상함수로 만들어 가상함수 테이블을 생성, 파생클래스의 소멸자를 가리켜 해
제시에 호출되도록 한다.
쓸때없이 가상함수테이블을 만들어 메모리를 차지하지 말자.
추상클래스를 원하는데 순수가상함수가 없을 때, 소멸자를 순수가상함수로 선언
정의 부에서 따로 가상함수를 선언해 두어야 함
또 다른 문제
Close 호출에 예외가 발생할 경우
Try-catch문 – 예외처리를 위한 문법
생성자,소멸자에서 가상함수 호출은 금지!
문제점
상속받은 BuyTransaction이 생성되기 전에
Transaction의 생성자가 실행되고 있다!
Operator=()을 사용할 시 주의 사항
Operator=()을 사용할 시 주의 사항_2
곁으로 보기에는 문제가 없다
항상 프로그래머를 빠가로 만드는 주역들
문제점, If( rhs==this )
거울을 보거든 그저 가만히 보기만 하라
하지만 new에 대한 예외에는 안전하지 않다.
내가 죽어도 슬프지 않게 클론을 만들자
„Copy and swap‟ 보고 넘어갑시다
Operator=()을 사용할 시 주의 사항_3
양현찬 : 멤버변수 하나 추가하면 함수에도 내용
을 추가해야 한다. 초기화 리스트에 추가하는 것
도 귀찮은데 이런 것도 해줘야 하나?
컴파일러 : ㅇㅇ
상속받은 클래스임에도 불구하고 초기화 리
스트에 상속받은 인자가 명시되지 않아
operator=함수에서 자기가 가진 고유한 멤
버만 복사된다!
계속되는 문제
역시 노가다
초기화 리스트에 명시해주고
부모의 operator=함수를 불러오자