Effective C++_1
131043 양현찬
NHN NEXT
C++ == „언어들의 연합체‟
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를 사용하자!
이게 무엇인가?
레퍼런스(참조자)를 사용해야 할 때
•참조하고자 하는 객체를 미리 알고 있을 때
•다른 객체를 바꾸어 참조할 일이 없을 때
•포인터를 사용하면 문법상 어색해질 때
Const
•변해서는 안됨을 가시화 시켜줌
•유효범위 상수를 선언
•Static으로 선언한 변수를 보호
•포인터의 경우 값과 주소값을 보호
Const와 포인터 사용법
Iterator와 const
함수와 const
함수와 const
물리적 상수성
분명 operator[]함수는 pText의 값을 변경하지는 않는다.
하지만 operator 함수로 인해 값이 변경되고 있다!
논리적 상수성
• 뭐 어때 너만 모르면, 난 상수함수다!
캐스팅 안 쓸땐 안 쓰더라도 코드 중복정돈 피해 두 되잖아?
재귀함수를 피하기 위해
비상수 객체를 상수 객체화
초기화 하자!
일반적으로는 이미 초기화가 이루어진 상태
정적 객체
•프로그램 끝날 때 까지 살아있는 객체
•초기화 순서는 정해져 있지 않다.
어디서 본듯한데? -> 싱글톤!
컴파일러가 만드는 함수들
자동으로 생성하는 함수들
자동으로 생성되는 상황
컴파일러가 거부하는 경우
•클래스를 구현한 코드가 적합하지 않거나 이치에
맞지 않을 경우
•예를 들면 참조자 멤버가 있는 경우
•이럴 경우 사용자가 직접 대입연산을 정의 해줘야
한다.
컴파일러가 만든 함수의 사용을 금지하고 싶을 때
복사 방지 클래스
다형성을 가진 클래스의 소멸자
문제점
팩토리 함수에서 받는 함수는 Timekeeper를 상속받는 파생클래스다.
따라서 할당 받은 메모리를 해제할 때 Timekeeper부분만 해제되고 파생클래스부분은 해제되지
못한 부분해제현상이 생김.
해결
소멸자를 가상함수로 만들어 가상함수 테이블을 생성, 파생클래스의 소멸자를 가리켜 해
제시에 호출되도록 한다.
쓸때없이 가상함수테이블을 만들어 메모리를 차지하지 말자.
또 다른 문제점
추상클래스를 원하는데 순수가상함수가 없을 때, 소멸자를 순수가상함수로 선언
정의 부에서 따로 가상함수를 선언해 두어야 함
소멸자의 예외처리
문제
예외처리방법
또 다른 문제
Close 호출에 예외가 발생할 경우
Try-catch문 – 예외처리를 위한 문법
생성자,소멸자에서 가상함수 호출은 금지!
문제점
상속받은 BuyTransaction이 생성되기 전에
Transaction의 생성자가 실행되고 있다!
그냥 안 쓰면 된다
explicit
Operator=()을 사용할 시 주의 사항
Operator=()을 사용할 시 주의 사항_2
곁으로 보기에는 문제가 없다
항상 프로그래머를 빠가로 만드는 주역들
문제점, If( rhs==this )
거울을 보거든 그저 가만히 보기만 하라
하지만 new에 대한 예외에는 안전하지 않다.
내가 죽어도 슬프지 않게 클론을 만들자
„Copy and swap‟ 보고 넘어갑시다
Operator=()을 사용할 시 주의 사항_3
양현찬 : 멤버변수 하나 추가하면 함수에도 내용
을 추가해야 한다. 초기화 리스트에 추가하는 것
도 귀찮은데 이런 것도 해줘야 하나?
컴파일러 : ㅇㅇ
상속받은 클래스임에도 불구하고 초기화 리
스트에 상속받은 인자가 명시되지 않아
operator=함수에서 자기가 가진 고유한 멤
버만 복사된다!
계속되는 문제
역시 노가다
초기화 리스트에 명시해주고
부모의 operator=함수를 불러오자
Effective c++ 1
Effective c++ 1

Effective c++ 1