8. Miscallenous Topics

42. Variable Initialization – Or is it?

어떤 차이가 있는가?

T t; 
T t();
T t(u);
T t = u;

전부 초기화이다. 대입이 아니다. operator=를 호출하지 않는다. T t {u}를 선호하라.

43. Const-Correctness

어디에 문제가 있는가?

class Polygon 
{
public:
  Polygon() : area_(-1) {}
  void  AddPoint( const Point pt ) { InvalidateArea();
                                     points_.push_back(pt); }
  Point GetPoint( const int i )    { return points_[i]; }
  int   GetNumPoints()             { return points_.size(); }
  double GetArea()
  {
    if( area_ < 0 ) // if not yet calculated and cached
    {
      CalcArea();     // calculate now
    }
    return area_;
  }
private:
  void InvalidateArea() { area_ = -1; }
  void CalcArea()
  {
    area_ = 0;
    vector<Point>::iterator i;
    for( i = points_.begin(); i != points_.end(); ++i )
      area_ += /* some work */;
  }
  vector<Point> points_;
  double        area_;
};
Polygon operator+( Polygon& lhs, Polygon& rhs )
{
  Polygon ret = lhs;
  int last = rhs.GetNumPoints();
  for( int i = 0; i < last; ++i ) // concatenate
  {
    ret.AddPoint( rhs.GetPoint(i) );
  }
  return ret;
}

void f( const Polygon& poly )
{
  const_cast<Polygon&>(poly).AddPoint( Point(0,0) );
}

void g( Polygon& const rPoly ) { rPoly.AddPoint( Point(1,1) ); }

void h( Polygon* const pPoly ) { pPoly->AddPoint( Point(2,2) ); }

int main()
{th
  Polygon poly;
  const Polygon cpoly;
  f(poly);
  f(cpoly);
  g(poly);
  h(&poly);
}

함수 선언에 const value로 전달하지 말라.

44. Casts

C 스타일 캐스팅을 쓰지 말라. const를 캐스팅으로 없애지 말라. 다운캐스팅을 하지 말라.

45. BOOL

빌트인 bool을 선호하라.

46. Forwarding Functions

함수 매개변수를 값이 아닌 const 참조로 전달하라. 언어의 잘 알려지지 않은 특성을 피하라. 가장 효율적인 간단한 기법을 쓰라. 성능 프로파일링으로 인해 필요가 드러나지 않는다면 최적화나 세세한 튜닝을 피하라.

47. Control Flow

global, static 오브젝트를 피하라. 써야만 한다면 초기화 순서를 잘 지켜라. 생성자의 초기화 리스트를 클래스 선언부 내에 등장하는 순서와 맞춰라. 항상 예외 안전한 코드를 쓰라. 예외가 있더라도 자원이 올바르게 해제되고 데이터가 일관적인 상태에 있도록 하라. 코드가 함수 인자 평가 순서에 의존하게 하지 말라.