본문 바로가기

Effective C++/1. C++에 왔으면 C++ 법을 따릅시다

(4)
항목 4: 객체를 사용하기 전에 반드시 그 객체를 초기화 하자 객체의 초기화에 있어서는 C++이 이랬다저랬다 하는 경향이 있다.(맘에 들지 않음) int x; 이 코드가 어떤 상황에서는 0으로 자동 초기화가 되지만, 또 다른 상황에서는 그렇지 않다는 것이다. class Point{ int x, y; }; Point p; 이렇게 했을 때에도, p의 데이터 맴버(x,y) 역시 어떤 상황에서는 0으로 자동 초기화가 되지만, 또 다른 상황에서는 안된다. => ???????????? 초기화되지 않은 값을 만약 그대로 읽으면 C++에서는 그대로 흘러 나오게 된다. 다른 언어에서는 뭐 초기화되지 않은 객체를 읽기만 해도 프로그램이 멈추는 경우도 있지만… C++의 객체 초기화가 중구난방인건 절대 아니다. 언제 초기화가 보장되며, 언제 그렇지 않은지에 대한 규칙이 명확하게 있지만,..
항목 3: 낌새만 보이면 const를 들이대 보자! cosnt = 외부 변경을 불가능 하게 하는 keyword => 값이 변하면 안되는게 맞다면, 우리도 반드시 지켜야 한다. 이렇게 해야 컴파일러가 const를 지키는데 한 몫 거들 수 있기 때문이다. char text[] = "hello"; char *p = text; 비상수 포인터, 비상수 데이터 const char *p = text; 비상수 포인터, 상수 데이터 char * const p = text; 상수 포인터, 비상수 데이터 const char * const p = text; 상수 포인터, 상수 데이터 iterator =: pointer std::vector vec; int arr[] = {1,2,3}; const std::vector::iterator iter = vec.begin(); con..
항목 2: #define을 쓰려거든 cosnt, enum, inline을 떠올리자 위 항목은 가급적 선행 처리자(#, preprosessor) 보다 컴파일러를 더 가까이 하자 라는 말임 #define RATIO 3.141592 라는 코드를 짰다고 생각하면, 컴파일러에게 넘어가기 전에 preprosessor가 RATIO라는 글자를 다 밀어버리고 3.14라는 상수로 바꾼다. 즉 RATIO라는 이름은 컴파일러가 쓰는 기호 테이블에 들어가지 않게 된다. 그래서 이 때 컴파일 에러라도 발생하게 되면 꽤나 헷갈릴 수 있다. RATIO에 에러가 났다고 해도 컴파일러는 3.14라는 상수에서 에러가 난 것으로 알기 때문에 에러 메세지에 RATIO라는 글자가 안 뜰 것이고 그럼 어디서 틀렸는지 햇갈릴 수 있다. 이 문제는 symbolic debugger(기호식 디버거)에서 나타날 수도 있다. 마찬가지로..
항목 1: C++를 언어들의 연합체로 바라보는 안목은 필수 초창기 C++ : C with Classes 라고 불릴 정도 예외(함수 구성방식 변화), 템플릿(새로운 프로그램 설계 방식), STL(확장성) 등등 => C++ : multiparadigm programming language (다중 패러다임 프로그래밍언어) 절차적 프로그래밍(구조적 프로그래밍) + 객체 지향 + 함수식(functional) + 일반화(generic) + metaprogramming 등등 여러 가지 패러다임이 포함되어있음. => 여러가지가 있는건 좋지만, 이들 사이에서 혼동을 느낄 수 있다. => C++ 를 단일 언어로 바라보는 시각에서 벗어나 상관관계가 있는 여러 언어들의 연합체로 봐야 한다. 그 후 각개격파 => C++는 여러 개의 하위언어를 제공한다고 봐야됨 C C++는 C를 기본으..