본격적인 C++ 강화를 위해 스콧마이어스의 Effective C++서적을 들여다 보게 되었다.
55개의 item을 정확하게 습득하려 한다.
선언(desclaration): '어떤 대상'의 타입과 이름을 컴파일러에게 알려주는 것
-객체 선언: extern int x;
-함수 선언: std::size_t numDigits(int number);
-클래스 선언: class Widget;
-템플릿 선언: template< typename T> class GraphNode;
시그니처(signature): 함수의 반환 타입과 매개변수
- std::size_t numDigits(int number)의 시그니처는 std::size_t(int t)
정의(definition): 선언에서 빠진 구체적인 세부사항을 컴파일러에게 제공하는 것
- 컴파일러가 그 객체에 대한 메모리를 마련해 놓는 것
int x; // 객체 정의
std::size_t numDigits(int number) // 함수 정의
{
std::size digitSoFar = 1;
while ((number /= 10) != 0) ++digitSoFar;
return digitSoFar;
}
class Widget{ // 클래스 정의
public:
Widget();
~Widget();
...
};
template<typename T> // 템플릿 정의
class GraphNode{
public:
GraphNode();
~GraphNode();
...
}
초기화(initialization): 어떤 객체에 최초의 값을 부여하는 과정. 사용자 정의 타입 객체의 경우 생성자에 의해 이루어짐
- 기본생성자(default constructor): 어떤 인자도 주어지지 않은 채로 호출될 수 있는 생성자
- explicit키워드를 사용하면, 암시적인 타입 변환을 수행하는데 쓰이지 않음
class A{
public:
A(); // 기본 생성자
};
class B{
public:
explicit B(int x =0, bool b = true) // 기본 생성자, x, b 기본값 지정
};
class C{
public:
explicit C(int x); // 기본 생성자 아님
}
객체 생성
void doSomething(B bObject);
B bObj1;
doSomething(bObj1);
B bObj2(28); // b는 디폴트인 true로
doSomething(B(28)); // 캐스팅!
복사생성자(copy constructor)
- 객체의 초기화를 위해 같은 타입의 객체로부터 초기화시 호출되는 함수.
- 복사대입 연산자(copy assignment operator): 같은 타입의 다른 객체에 더떤 객체의 값을 복사하는 용도
class Widget{
public:
Widget(); // 기본 생성자
Widget(const Widget& rhs); // 복사 생성자
Widget& operator=(const Widget& rhs); // 복사 대입 연산자
...
};
Widget w1; // 기본 생성자 호출
Widget w2(w1); // 복사 생성자 호출
w1 = w2; // 복사 대입 연산자 호출 (=는 복사 생성자 호출에 쓰일 수 있음 Widget w1 = w2/ 값에 의한 객체 전달을 정의해주기도 함 if(func(aWidget))의 경우, 값을 복사해서 보내주는 것)
STL(Standard Template Library)
-C++의 표준 라이브러리에 속해있는 라이브러리
-컨테이너, 반복자, 알고리즘과 관련된 기능을 함수객체가 차지
미정의 동작(Undefined behavior)
- 실행 시간에 어떤 현상이 터질지 예측할 수 없다 => 하드가 날라갈 수 있는 안좋은 상황
int *p = 0; // null 포인터
std::cout << *p // null 포인터 역참조(미정의 동작)
char name[] = "Darla"; // 6칸짜리 배열
char c = name[7]; // index오류(미정의 동작)
인터페이스(interface)
-함수의 시그니처, 혹은 어떤 클래스의 접근가능 요소
-일반적인 설계 아이디어로서의 인터페이스
사용자(client)
-우리가 만든 코드(인터페이스)를 사용하는 아무개 혹은 아무것
-함수를 호출하는 코드, 코드작성자, 유지보수하는 자 등등
-이 책에서는 사용자를 프로그래머로 봄(잘못 만들면 골치아파하는 쪽이 프로그래머이므로
-사용자의 인생을 편하게 만들자!!!
-ctor: 생성자/ dtor: 소멸자
lhs(left-hand side, 좌변), rhs(right-hand side, 우변)
const Rational operator*(const Rational& lhs, const Rational& rhs);
포인터 pt
-Widget 포인터: pw
-Airplane 포인터: pa
-GameCharacter 포인터: pgc
멤버함수 mf
TR1(Technical Report 1)
-C++ 표준 라이브러리에 새로 추가되는 기능들에 대한 명세
-클래스 및 함수 템플릿이 주류, 해시 테이블, 참조 카운팅 방식 스마트 포인터, 정규 표현식 등
-tr1 네임스페이스에 모두 포함. tr1네임스페이스는 std네임스페이스 안에 중첩됨
부스트
-전문가로부터 교차 검증을 거친 플랫폼 간 이식성도 가진 오픈소스 C++라이브러리를 제공하는 단체
-웹사이트: http://boost.org
-TR1의 구성요소 중 대부분이 이곳에서 만들어짐