본문 바로가기

전체 글57

항목 8. 예외가 소멸자를 떠나지 못하도록 붙들어 놓자 말그대로 예외 동작이 소멸자 내에서 종료되어야 함을 의미한다. 1. 소멸자가 호출되는경우 (1) 정상적으로 객체가 종료되었을때 (2) 예외처리 메커니즘에 의해 객체가 소멸될때 (2)와 같이 예외처리 메커니즘에 의해 객체가 소멸될때 또 예외가 발생한다면, terminate함수가 호출되어 프로그램이 종료된다. 따라서 try catch로 예외를 소멸자내에서 묶어두어야 한다. 일반적으로 c++은 예외를 내보내는 소멸자를 좋아하지 않는다!!라고 생각하자. 자 우선 이 코드를 봐보자. class DBConnection { public : ... static DBConnection create(); void close(); }; class DBConn { public : ... ~DBConn() { db.close(.. 2019. 12. 17.
항목 4. 객체를 사용하기 전에 반드시 그 객체를 초기화하자 int x; 초기화 되는가? 상황에 따라 다르다. c++ 객체 초기화는 중구난방이 아니라, 명확한 규칙이 있다. 일단 가장 좋은 방법은 모든객체를 사용전에 항상 초기화하는 것이다. (아래코드 참조) int x = 0; const char* text = "test"; c++의 초기화의 나머지부분은 생성자로 귀결된다. 생성자는 객체의 모든 데이터를 초기화 해야한다. 1. 대입과 초기화를 헷갈리지 말자. class PhoneNumber {}; class ABEntry{ public : ABEntry(const string& name, const string& address, const list& phones); private: string theName; string the Address; list thePh.. 2019. 12. 15.
항목 3. 낌새만 보이면 const를 들이대 보자! 상수성에 대해 알아보기위해 연산자 정의 코드를 살펴보자. const Complex operator +(const Complex &T) const { Complex R; R.image = image + T.image; R.real = real + T.real; return R; } 1. 인수를 레퍼런스로 넘기는이유 (1) 크기 때문에 비효율적이므로 레퍼런스로 넘기는 것이 유리하다. (2) 직관적 표현을 위해서 1) 포인터로 넘기는경우 c3 = c1 + &c2 이런 형태가 될 것이다. 2. 인수의 상수성 (1) a+b인 경우, 인수로 전달되는 우변의 값을 변경하는 경우는 전혀 없으며, 단지 읽기만 한다 즉, const 지정자를 붙이는 것이 안전하다. (2) 안붙인다면? const complex c2(1.0,.. 2019. 12. 10.
항목 2. #define을 쓰려거든 const, enum, inline을 떠올리자 1. #define ASPECT_RATIO 1.653의 결과는? (1) 결과 - 우리에겐 ASPECT_RATIO로 보이지만, 컴파일러에겐 보이지 않음. 선행처리자가 컴파일러에게 넘기기전에 1.653으로 바꾸기 때문이다. (2) 예상문제점 - 컴파일러에서 문제가 생길시 1.653에 문제가 있다고한다.(ASPECT_RATIO가 아닌) 사용자는 1.653이 어디서 왔는지 모를 수 있다. 또한 컴파일러에서 사용하는 데이터구조 테이블인 심볼테이블에 인풋되지 않는다. 2. 해결방법 - 매크로대신 상수를 사용하자. const double AspectRatio = 1.653; (1) 장점 : 데이터를 줄일수있다, 심볼테이블에 인풋된다. (2) 이유 : ASPECT_RATIO를 10번쓰면 10개의 사본이 생기기 때문이다.. 2019. 12. 4.
항목 6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해버리자 Q. 나는 유일한 존재다. 그래서 나를 클래스화했을때 나를 복제(복사생성자 or 복사대입자)해선 안된다라고 가정했을때, c++에서 어떤 방법으로 이 문제를 풀수 있을까? 답변전에 확인한가지 해보자. 컴파일러가 암시적으로 생성하는 함수들(항목5에있음)은 모두 public멤버이다. 우리가 위함수를 명시하면, 컴파일러는 암시적함수생성을 포기한다. 그런데 우리가 이 함수를 명시할때, 어떤누구도 public을 꼭써야만해 라고 말한사람이없다. 답변1. A. private로 선언하자, 이경우 이 함수들이 비공개의 접근성을가지므로 외부의 호출을막을수 있다. ->90%정답 다시의문을가져보자. Q. 그 클래스의 멤버함수나, friend 함수를 사용하면 이를 막을수없다. 어떻게?! A. private 로 선언한 함수의 정의.. 2019. 10. 23.
항목 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 클래스가 비어있지만 비어있지 않을때는 언제일까? 답은 빈클래스를 컴파일러가 훑고지나갈때이다. 이때 컴파일러는 "암시적"으로 생성자, 복사생성자, 복사대입연산자, 소멸자를 생성한다.(기본타입형으로, public멤버이며 inline함수이다.) 따라서, 개발자는 컴파일러가 암시적으로 만들어내는 함수에 촉각을 세워야한다. 중간정리 : 암시적 함수의 생성을 막기위해, 개발자는 해당함수를 미리 명시한다. Q. 복사대입연산자가 암시적으로 만들어지지 않는경우는? 답을확인하기전에,하나만 짚어보자. 컴파일러는 암시적자동생성을위해 두가지 조건을따진다. 최종결과코드가 1. legal한지, 2. reasonable한지. A. 참조자(reference)와 상수타입이 있을때 사용자는 고민해야한다. 만약 멤버 변수에 참조자와 상수타.. 2019. 10. 23.