2013-04-18 1 views
1

C++ 지식을 향상 시키려고했지만 이전 프로그래밍 콘테스트에서이 문제를 발견했습니다. 올해 대회에 참가하려고 노력할 준비가되어 있습니다.C++ 프로그램의 출력

다음 프로그램의 출력은 무엇입니까?

#include <iostream> 

using namespace std; 

int dat=1; 
int counter=0; 

class ClassB; 

class B { 

    public: 
      virtual void f(int d=5)=0; 
      }; 

class A { 

    unsigned i; 
    public: 
     int pod; 
     int index; 


     A& operator++() { cout<<"A "<<pod--<<dat++<<endl; A* b=new A; return *b; } 
     A operator++(int) {cout<<"B "<<pod++<<dat--<<endl; A* b=new A; return *b;} 
     A& operator--() {cout<<"C "<<dat++ <<++pod<<endl; A* b=new A; return *b;} 
     A operator--(int) {cout<<"D "<<dat--<<--pod<<endl; A* b=new A; return *b;} 
     void operator+(A& b) {cout<<"Addition Index "<<index<<endl; pod++;} 

     friend void B::f(int); 
     A() : i(0), pod(dat) {pod++; index=++counter; cout<<"CA "<<"Index "<<index<<endl; } 
     ~A(){pod++; cout<<"DA Index "<<index<<endl;} 

};    


const ClassB& returnClassA(const ClassB& p) {return p;} 


class ClassB: public A, public B { 
    public: 
     void f(int d=2){A c; c++; pod*=d--;} 
     ClassB(){cout<<"CB Index "<<index<<endl;} 
     ~ClassB(){cout<<"DB Index "<<index<<endl;} 
}; 


ClassB returnClassB(ClassB s) {return s;} 

class ClassC : public ClassB { 
    public: 
     ClassC(){cout<<"CC Index "<<index<<endl;} 
     ~ClassC(){cout<<"DC Index "<<index<<endl;} 
}; 

ClassB returnClassC(ClassB s){return s;} 

int main() 
{   
    ClassC x;  
    A v,w;    
    B *c = new ClassB; 

    --++v--+++w; 

    returnClassC(returnClassB(returnClassA(x))); 

    return 0; 

} 

이것은 종이에 풀릴 것으로 생각되지만 초보자이기 때문에 컴파일러를 사용했습니다. 또한 변수 카운터와 인덱스가 추가되었으므로 생성되는 개체를 추적 할 수 있습니다. 원래의 표현은 - ++ v - +++ w--; 그러나 나는 그것을 - ++ v - +++ w로 바꿨다. 왜냐하면 컴파일러가 저에게 오류를주기 때문입니다.

부분 :

ClassC x;  
A v,w;    
B *c = new ClassB; 

출력 :

  1. CA 색인 1
  2. CB 지수 1
  3. CC 지수 1
  4. CA 색인 2
  5. CA 색인 3
  6. CA 지수 4
  7. CB 지수 이해 4

.

다음 표현식을 이해하는 데 문제가 있습니다. - ++ v - +++ w; 그래서 처음에는 - ++ v - ++의 출력을 이해하려고 노력했습니다. 그리고 나서 + w를 추가합니다.

- ++ v - ++; 이다

  1. D 11
  2. CA 색인 5
  3. B 10
  4. CA 색인 6
  5. 0 -1
  6. CA 색인 7
  7. C 02
  8. CA 색인 8
  9. DA 색인 6
  10. DA 색인 5

즉, 작업 순서는 - (++ ((-) ++))입니다. 왜 이렇게됩니까? 어떤 연산이 먼저 평가되는지에 대한 규칙이 있습니까? 또한 인덱스 6과 5가있는 개체의 소멸자가 호출되는 이유를 모르겠습니까?

원본 표현식을 사용하는 경우 - ++ v - +++ w; , 출력은 :

  1. D 11
  2. CA 색인 5
  3. B 10
  4. CA 색인 6
  5. 0 -1
  6. CA 색인 7
  7. C 02
  8. CA 색인 8
  9. 추가 색인 8
  10. DA 지수 6 + w 작업이 마지막으로 평가되는 이유는
  11. DA 지수 5

? 운영자 우선 순위 때문입니까? 또한, 만약 내가 wout < < v.index를 작성하면 2를 반환한다는 것을 알았습니다. v는 여전히 이전에 생성 된 원래의 객체라는 것을 의미합니다. 그렇다면 인덱스 5-8이있는 객체는 어디로 이동합니까? 어떻게 액세스 할 수 있습니까?

마지막 부분 인 returnClassC (returnClassB (returnClassA (x)))); 출력 :

  1. DB의 인덱스 1
  2. DA 지수 1
  3. DB의 인덱스 1
  4. DA 지수 1
  5. DB의 인덱스 1
  6. DA 지수 1

I 돈 소멸자가 왜 불려지는지 이해하지 못합니까?당신이 C에서 연산자를 오버로드 할 때 을주의해야 할

+1

나는 바보 같은 코드를 깨뜨리는 것이 C++ 지식을 향상시키는 가장 좋은 방법이라고 생각하지 않는다. – yngccc

+2

****에 시간을 낭비하지 마라. –

+0

@Nikola - 코드가하는 일을 말하는 것이 어렵다면 유용하지 않습니다. 너는 결코 이와 같은 것을 쓰지 않을 것이다. 목표는 아무도 이해할 수없는 코드가 아니라 분명히 * 올바르게 작동하는 코드를 작성하는 것입니다. :-) –

답변

0

몇 가지 ++ 알아야 할 사항이있다, 예를 들어 ++ 당신은 선행 증가

++i 

또는 사후 증가 할 caneither

i++ 

오버로드 중인지 컴파일러에 알리기 위해 서명에 매개 변수 또는 int가 필요하지 않습니다.

A operator++(int) 

포스트 incremennt 과부하되고,

A& operator++() 

과부하 사전 증가는

C에서

++ 객체의 desctructor는 이가지 경우

당신은 객체 당신에 대한 포인터에 삭제 전화
  1. 에서 호출 신규를 사용하여 할당 됨

    A* = new A(); //constructor is called 
    delete(A);//destructor is called 
    
  2. 일부 사업자 사본을 반환하는 방법을

    당신은 다른 사람에 대한 참조를 반환 코드에서 스택

    if(something) { 
        A a(); 
        ... 
    } //here a's destructor is called because a no longer exists 
    

공지 사항에 생성 된 개체에 대한 컨텍스트를 둡니다.

A operator++(int) 

이 함수는 사본을 반환합니다. 즉,이 특정 함수를 호출 할 때 생성자는 호출 된 새 A에 대한 함수 내에서 한 번 호출되고 b에 의해 가리키는 객체의 복사본이 복사됨에 따라 함수에서 돌아올 때 다시 호출됩니다.

당신은 연산자 우선 순위 [여기] ( http://en.cppreference.com/w/cpp/language/operator_precedence)

에 대한 몇 가지 infromation를 찾을 수 있습니다

나는이 같은 코드에서 배울 쓸모 tellign을 일부 사람들이 알 수 있습니다. 나는이 방법으로 코딩하는 것이 나쁘다는 것에 동의하지만, 생성자/소멸자, 힙/스택 및 연산자가 C++에서 작동하는 방법에 대해 많은 것을 가르쳐 줄 수 있습니다. 아마도 더 나은 학습 방법이있을 것입니다, 이것은 나에게 꽤 '중간 시험'처럼 보입니다.

+0

답장을 보내 주셔서 감사합니다. 나는 Post/Pre Increment의 개념을 이해하고 코드를 이해합니다. 내가 이해할 수없는 것은 - ++ v - +++ w와 같은 표현식이있을 때 호출되는 순서입니다. 가장 먼저 오는 이유는 무엇입니까? – Random

+0

내가 보낸 링크는 왼쪽에서 오른쪽으로 이동하는 운영자를 알려줍니다. – Boumbles

+0

아, 지금은 왼쪽에서 오른쪽으로 의미하는 것이 무엇인지 이해하지 못했습니다. 감사합니다. 새 회원으로 투표 할 수 없습니다. – Random