2016-09-01 2 views
-4

이 코드를 가지고 있는데 Fat 클래스의 계약 업체에서 무슨 일이 일어 났는지 이해할 수 있습니다.생성자 및 복사 생성자 설명 예제

#include <iostream> 
using namespace std; 
class Block{ 
    int data; 
public: 
    Block(int i = 10) : data(i){ 
    cout << "I just created a Block " << endl; 
    } 
    ~Block() { 
    cout << "I will destroy a Block with " << data << endl; 
    } 
    void inc() { 
    data++; 
    } 
}; 

class A{ 
    Block& block1; 
    Block block2; 
    public: 
    A(Block& blk) : block1(blk), block2(blk) { 
     cout << "I just created an A " << endl; 
    } 

    A(const A& a): block1(a.block1), block2(a.block2) { 
     cout << "I just created an A by copying but I will also do bad things" << endl; 
     block1.inc(); block2.inc(); 
    } 
    ~A() { 
     cout << "I will destroy an A " << endl; 
    } 

    void inc() { 
     block1.inc(); block2.inc(); 
    } 
    }; 

class Fat{ 
    A a; 
    A& ra; 
    A* pa; 
public: 
    Fat(A& da) : a(da),ra(da) { 
    pa = new A(da); 
    cout << "Fat just created !" << endl; 
    } 
    ~Fat() { 
    delete pa; 
    cout << "Fat to be destroyed !" << endl; 
    } 
    void inc() { 
     a.inc(); 
     ra.inc(); 
     pa->inc(); 
    } 
    }; 

int main(){ 
    Block block; 
    A a(block); 
    Fat fat(a); 
    fat.inc(); 
    return 0; 
} 

이 결과 :

I just created a Block 
I just created an A 
I just created an A by copying but I will also do bad things 
I just created an A by copying but I will also do bad things 
Fat just created ! 
I will destroy an A 
I will destroy a Block with 12 
Fat to be destroyed ! 
I will destroy an A 
I will destroy a Block with 12 
I will destroy an A 
I will destroy a Block with 11 
I will destroy a Block with 15 

왜 복사 생성자 실행 두 번합니까?

pa = new A(da); 

이 때문에 그것을 da 복사하여 자유 공간에서 A의 새로운 인스턴스를 생성이어서

Fat(A& da) : a(da), ra(da) { 

라인 :

+5

코드를 포맷하십시오. –

+2

코드를 축소 기 또는 다른 것으로 실행 했습니까? – Borgleader

+1

이 질문은 모든 노력이 부족하기 때문에 주제를 벗어난 것으로이 질문을 닫으려고합니다. – Eiko

답변

2

:

Fat(A& da) : a(da), ra(da) { 

a(da)이 하나가 A의 복사 생성자 호출

클래스 지방 생성자의 초 1 초 :

Fat(A& da) : a(da), ra(da) { 
    pa = new A(da); //HERE!! 
    cout << "Fat just created !" << endl; 
} 

다시 pa = new A(da);으로 A의 복사본 생성자를 호출합니다.

편집 : 코드 서식을 주셔서 감사합니다.

+0

그래서 ra와 어떻게됩니까? 그냥 가리킨거야? –

+0

그것은 a의 참조입니다. –

0

제 복사 Fat에서 a 멤버 변수를 초기화하도록 이루어진다 복사 생성자를 호출합니다. 당신이 A의 기존 인스턴스에 대한 포인터를 만들고 싶었다 아닌 경우에 당신은 작성해야

첫 번째 "I just created an A by copying but I will also do bad things"이 줄에서 온다
pa = &da; 
+1

C++에는 * "heap"*에 대한 언급이 없습니다. * freestore *를 언급하고 있습니다. – IInspectable

+1

@IInspectable Bjarne Stroustrup은 그의 책 "The C++ Programming Language"의 277 쪽에서이 용어를 사용합니다. "동적 메모리"와 함께 "무료 저장소"의 동의어로 나열됩니다. Bjarne에 대해 충분하다면 ... –

+0

@IInspectable 정직하게 말하면 매우 보잘것없는 구별이고 afaik 대부분의 C++위원회 멤버는 힙이라는 용어를 사용합니다. – Borgleader