2014-11-13 5 views
0
#include <iostream> 
using namespace std;  

class A 
{ 
public: 
int x; 
    A(){x= 30; cout << "A's constructor called " << endl;} 
    A(const A& obj) { cout<<"A's copy constructor called " <<endl; } 
}; 

class B 
{ 
public: 
    static A sample; 
    B() { cout << "B's constructor called " << endl; } 
    static A getSample() { return sample; } 
}; 

A B::sample; 

int main() 
{ 
    A one; 
    A two = B::getSample(); 
    cout<<B::sample.x<<endl; 
    cout<<one.x<<endl; 
    cout<<two.x<<endl; 
    return 0; 
} 

출력 위의 코드 :C++ 복사 건설

A's constructor called 
A's constructor called 
A's copy constructor called 
30 
30 
-1032819680 

B::getSample()에 X의 생성자 복사 값을 복사하지 않습니다. 즉, B::getSample()=30인데 왜 two.x-1032xxxxxx입니까?

답변

1

동작이 올바른지, 그들은이어야하는 constrcutors이라고 복사 :하지만 ...

당신이 two.x30를 싶은 경우에, 당신은 당신의 복사 생성자 내에서 x 값을 복사하는 ... 어떤 필요 귀하의 코드에있는 경우가 아닙니다. A's copy constructor called 만 인쇄하면 복사 생성자는 아무런 효과가 없습니다.

그냥, 그런
A(const A& obj) 
{ 
    cout<<"A's copy constructor called " <<endl; 
    x = obj.x; // added! 
} 

로 변경 프로그램에서 표시 : 당신이 하나를 정의하지 않는 경우

A's constructor called 
A's constructor called 
A's copy constructor called 
30 
30 
30 
4

x 값을 복사하지 않는 사용자 고유의 복사 생성자를 정의했습니다. 그래서 그것은 초기화되지 않은 상태로 남아 있습니다.

0

두 개는 정의한 복사 생성자를 사용하여 초기화됩니다. 그리고 그 정의에서 x에 어떤 값도 할당하지 않았습니다. 그것이 쓰레기를 인쇄하는 이유입니다.

0

는, 컴파일러가 기본 복사 생성자를 생성합니다,주의하십시오. 얕은 복사 의미는 표준 할당 연산자 ('=')를 사용하여 클래스의 각 멤버를 개별적으로 복사합니다.

x=obj.x; 

어쨌든 이렇게하는 것이므로 무시할 이유가 없습니다.

동적으로 할당 된 메모리 (또는 포인터)가없는 간단한 클래스가 있으면이 방법이 적합합니다. 그러나 포인터 (데이터 청크를 가리키는)를 복사하려는 경우 얕은 사본이 작동하지 않습니다. 할당 연산자가 포인터의 주소를 복사하고 메모리를 할당하지 않거나 지시 할 내용을 복사하지 않기 때문입니다.