2013-08-15 3 views
0

다음은 "프로그래밍 : C++을 사용하는 원리와 실습"에서 발췌 한 것입니다. 나는 Bad_area() 표기법을 사용하여 혼란스러워합니다. 이 책은 "Bad_area()는 Bad_area 유형의 객체 만들기"를 의미하며 계속 그 유형을 던집니다. 이 설명은 과제 표기법과 일치하지 않습니다. int x = 1 == int x (1); 또는 Bad_area x;. (은 try 블록을 주석)C++ 예외 빈 클래스를 throw

예제 코드 :

class Bad_area {}; // a type specifically for reporting errors from area() 

// calculate area of a rectangle 
// throw a Bad_area exception in case of a bad argument 
int area(int length, int width) 
{ 
    if (length<=0 || width<=0) throw Bad_area(); 
    return length*width; 
} 

int main() 
try { 
    // ... 
} 
catch (Bad_area) { 
    cout << "Oop! bad arguments to area()\n"; 
} 

답변

0

Bad_area() 클래스 Bad_area의 기본 생성자에 명시 적으로 호출합니다.
즉, throw Bad_area()이 수행하는 작업은 클래스 Bad_area의 anonimus 인스턴스를 직접 반환 (throw)하는 것입니다.

인스턴스를 직접 반환 할 때 Java 또는 C#과 같은 OO 언어와 동일합니다. 인스턴스의 수명이 RAII를 기반으로하기 때문에 생성자가 명시 적으로 호출 rarelly, C++에서 사용되는

void foo() throws MyException 
{ 
    if(error) throw new MyException(); 
} 

참고 : 예를 들면.
명시 적 호출이 좋은 아이디어 인 경우는 드물지만 대부분 사례, return 문과 같습니다. 예를 들어, point_2d 클래스 느릅 나무 대수적 방법은 easilly 인라인 :

struct point_2d 
{ 
    float x; 
    float y; 

    point_2d(float _x = 0.0f , float _y = 0.0f) : x(_x) , y(_y) {} 

    //Easy inlineable addition: 
    point_2d operator+(const point_2d& lhs , const point_2d& rhs) 
    { 
     return point_2d{ lhs.x + rhs.x , lhs.y + rhs.y }; 
    } 
}; 

을 다른 한편으로는, 예외적 인 경우는, 생성자에 직접 호출이을 피할 수 있어야 execpt. 일반적으로 Java 형식의 newebbie C++ 코드를 볼 수 있습니다.

int main() 
{ 
    point_2d* point = new point_2d(10.0f , 10.0f); //Ok, this is not exactly a call to 
                //to the ctor, but has the same meaning. 
                //WTF why you use dynamic memory here? 
} 

또는 올바른 C++ 변수 선언, 자바 초기화 다음 : 예를 들어

int main() 
{ 
    point_2d point; 

    point = point_2d(10.0f , 10.0f); //WTF!!! 
} 

컴파일러에 따라, 또는 최적화는 모두가 noobs에이 최적화를 실행하지 않을 것을 알고 (전원이 꺼져있는 경우 ...),이 결과에서 :

  • 생성자를 point_2d를 호출 (명시 적 호출)
  • 호출 0에
  • point_2d 소멸자 (ctor 호출로 생성 된 시간의 소멸)에 대한 호출.

또는 마지막으로 동일하지만 같은 라인에있는 모든 다음 point_2d가 생성과 변수를 초기화하는 생성자를 복사에 호출 다음에 point_2d 생성자를 호출입니다

int main() 
{ 
    point_2d point = point_2d(10.0f , 10.0f); //WTF!!! 
} 

일시적인.

은 C++ stye/할 일이 없기 때문에이 경우의 성능은 중요하지 않습니다.. 그런 식으로 C++ 코드를 작성하는 모든 사람은 a good C++ book을 사야합니다. Effective C++은 다가올 Java와 유사한 프로그래머를 염두에두고 수정되었습니다.

+0

그럴까요? 나는 괄호를 삭제해서 생성자 대신 ** Bad_are **를 던져야한다고 말합니까? 기본 생성자가 내가 알지 못하는 것을하지 않는 한 어떻게 다른지를 확신하지 못합니다. –

+0

@ user2684847 아니요, 괄호를 떨어 뜨릴 수 없습니다. 당신은 요점을 얻지 못했습니다. 'Bad_area'는 타입이 아니고 인스턴스가 아니기 때문에'Bad_area 던짐; 'Bad Bad_area()'를 사용하여 우리가하는 일은 생성자 **에 대한 호출에 의해 생성 된 ** 인스턴스를 반환 (Throw)하는 것입니다. – Manu343726

+0

아, 보시다시피, ** Bad_area **의 임시/익명/이름이 지정되지 않은 인스턴스 ("객체"로 배웠습니다)와 같아서 catch (Bad_area)에 인수로 전달됩니다. 책은 이것을 다루지 않습니다. –

관련 문제