71
Effective C++_1 131043 양현찬 NHN NEXT

Effective c++ 1

  • Upload
    -

  • View
    1.563

  • Download
    0

Embed Size (px)

Citation preview

Effective C++_1131043 양현찬

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=함수를 불러오자