2. C++은 이렇게 구성되어 있다
• C
– C++의 기반은 C언어.
• C++ of Objective
– „클래스‟, 그리고 그것의 특징들(캡슐, 상속…)
• C++ of Templete
• STL
3. #define 대신에 쓸 수 있는 것들
• 단순한 상수를 쓸 때는
– const
• const char* const name = “namse”
– enum
• 함수같은 매크로를 만들고 싶을땐
– inline
4. const
• Const 멤버변수를 정의할 때
• .h -> static const double A;
• .cpp -> MyClass::A = 1.35;
• 상수 포인터, 상수 데이터
• 상수 포인터 : 포인터 자체가 상수
• 상수 데이터 : 포인터가 가르키는 대상이 상수
Char *name = myName;
비상수
포인터
비상수
데이터
Const Char *name = myName; 비상수p 상수d
Char * const name = myName; 상수p 비상수d
Const Char * const name = myName; 상수p 상수d
5. const
• Const std::~::iterator iter;
– Iter가 상수. *iter는 상수 아님.
• Std::~::const_iterator iter;
– Iter는 비상수, *iter는 상수!
• 상수 함수
– Void function() const { blah blah;}
– 데이터 멤버 터치 X ( static 빼고!)
– 음… 몇 개는 적당히 터치해도 되지 않을까?
• Mutable. ( mutable int size; )
6. const
• 상수 함수
– 비상수 함수 코드를 컨시브이 해야하는가?
– Const_cast, static_cast를 이용할 것!
– char& func() {
return
const_cast<char&>(
static_cast<const MyClass&>
(*this)->func()
);
}
7. 초기화
• 생성자에서 값을 다 넣어주는 것?
– I::I(){ name = “namese”; }
– 이건 초기화가 아님! 대입임!
• 멤버 초기화 리스트를 사용하자!
– I::I():name(“Namse”) {}
• 왜죠?
– C++이잖아…
8. C++이 자동 생성하는 함수
• Class MyClass{};
– MyClass()
– MyClass(const MyClass& rhs) {…}
– ~MyClass() {…}
– MyClass& operator=(const MyClass& rhs) {..}
• C++이 만든 함수가 당신이 만든 객체에 어울
리는지 잘 판단해야 합니다!
– 그 함수들을 사용해선 안된다고 판단된다면?
– private 멤버로 선언하고
일부러 정의(구현)하지 마세요!
9. C++이 자동 생성하는 함수
• Class MyClass{};
– ~MyClass() {…}
• 다형성을 사용해야 할 경우엔
– 소멸자를 항상 virtual로 선언하자
– 왜?
– 파생 클래스의
모든걸 지우지 못할 수 있으니까!
10. C++이 자동 생성하는 함수
• Class MyClass{};
– ~MyClass() {…}
• 소멸자에서 예외가 나온다고?
– 예외가 나올 수 있는 소멸자는 시한폭탄!
• Try, chtch문을 소멸자에 사용하여
예외를 다 처리하거나,
• 프로그램을 아예 끝내버리거나…
• 예외는 오직 보통의 함수에서 나오도록!
11. C++이 자동 생성하는 함수
• Class MyClass{};
– MyClass(){…}
– ~MyClass() {…}
• 파생 클래스 생성자는 기본 클래스 생성자를 실행
한다.
– 그때, 기본 클래스 생성자에서 실행되는 가상함수
– 당연히 파생 클래스꺼로 실행되겠지^^
– 하지만, 기본 클래스의 함수가 실행된다.
– 기본 클래스의 생성자가 호출될 동안에는 가상 함수는
절대로 파생 클래스 쪽으로 내려가지 않는다.
• 생성자, 소멸자 안에서는
가상 함수 호출 하지 마세요!
12. C++이 자동 생성하는 함수
• Class MyClass{};
– MyClass& operator(const MyClass& rhs){…}
• int x,y,z; x = y= z = 15;
– 이게 관례잖아? 그러면 나의 클래스도…
• 대입 연산자에선 *this를 반환하게 하자!
X = ( Y = ( Z = 15 ) );
mc = mc1 = mc2 = new MyClass(25);
mc = ( mc1 = ( mc2= new My class(25) ) );