[EC++] Chapter 5. 구현

후이재·2020년 8월 30일
1

요약

(27.캐스팅)

  • 다른 방법이 가능하다면 캐스팅은 피하십시오 특히 수행성능에 민감한 코드에서 dynamic_cast는 몇 번이고 다시 생각하십시오 설계중에 캐스팅이 피요해졌다면, 캐스팅을 쓰지 않는 다른 방법을 시도해 보십시오.
  • 캐스팅이 어쩔 수 없이 피요하다면, 함수 안에 숨길 수 있도록 해 보십시오. 이렇게 하면 최소한 사용자는 자신의 코드에 캐스팅을 넣지 않고 이 함수를 호출할 수 있게 됩니다.
  • 구형 스타일의 캐스트를 쓰려거든, C++스타일의 ㅐ스트를 선호하십시오. 발견하기도 쉽고, 설계자가 어떤 역할을 의도했는지가 더 자세하게 드러납니다.

Item26: 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자


Item27: 캐스팅은 절약, 또 절약! 잊지 말자

캐스팅 표현의 종류

  1. C스타일의 캐스트(구형 스타일의 캐스트): (T)표현식 or T(표현식)
  2. C++스타일의 캐스트(신형 스타일의 캐스트)
	const_cast<T>(표현식);       // 객체의 상수성을 없애는 용도
	dynamic_cast<T>(표현식);     // 안전한 다운캐스팅
	reinterpret_cast<T>(표현식); // 포인터를 int로 바꾸는 등 하부 수준의 캐스팅
	static_cast<T>(표현식);      // 암시적 변환

C++ 스타일의 캐스트를 쓰는것이 바람직하다

  • 코드 알아보기 쉬움
  • 캐스트 사용 목적을 좁혀 지정하기 때문에, 에러 진단에 유용함
  • 구형 스타일의 캐스트는 함수에 객체를 넘기기 위해 사용할 때 사용하곤함
	doSomeWork(Widget(15)); // int인 15를 Widget캐스트로 객체를 생성

코어덤프가 곧잘 나는 코드를 잘 살펴보자

  • 오.. 그럴듯한데? 라는 느낌이 날 때는 넘어가지 말고 신형캐스트를 쓰도록.
  • 데이터가 메모리에 그대로 있을것이라는 섣부른 가정을 피하자
  • 레퍼런스를 공유하더라도 값이 같지 않을 때도 가끔 있다.

파생클래스의 함수를 호출하고 싶을 때?

  • dynamic_cast를 쓰고싶겠지만,
  1. 파생클래스 객체에 대한 포인터를 컨테이너에 담아두자.
	typedef std::vector<std::trl::shared_ptr<SpecialWindow>> VPSW;
	VPSW winPtrs;

	for(VPSW::iterator iter = winPtrs.begin();iter != winPtrs.end();++iter)
		(*iter) -> blink(); // cast하지 않고도 SpecialWindow의 blink를 호출!
  1. blink함수를 기본 클래스에 넣자(가상함수로 제공)

정말 피해야할 것, 폭포식 dynamic_cast

  • A로 캐스팅되면 ~ 수행 B로 캐스팅되면 ~수행 이렇게 if문의 향연이 이뤄지는 캐스팅
  • 이런 코드때문에 C++가 욕을 먹음
  • 정말 잘 작성된 C++ 코드는 캐스팅을 거의 쓰지 않음
  • 가상함수 호출과 같은 방법을 사용하여 고치자

Item28: 내부에서 사용하는 객체에 대한 "핸들"을 반환하는 코드는 되도록 피하자


Item29: 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자!


Item30: 인라인 함수는 미주알고주알 따져서 이해해 두자


Item31: 파일 사이의 컴파일 의존성을 최대로 줄이자

profile
공부를 위한 벨로그

0개의 댓글