2016-07-15 8 views
-2

개별 요소를 복사 할 때 다음과 같은 방식으로 개체를 복사 할 수 있는지 알고 싶습니다.C++에서 개체 복사

#include <iostream> 
using namespace std; 

class abc{ 
public: 
    abc(int a = 10, int b = 5); 
    abc(const abc &obj, int b = 10); 

    int ret_x() { return x; } 
    int ret_y() { return y; } 
private: 
    int x; 
    int y; 
}; 

abc::abc(int a, int b) 
    : x(a), 
    y(b) 
{ 
} 

abc::abc(const abc &obj, int b) 
{ 
    if (this != &obj) { 
     *this = obj; -----> Copying the object 
    } 
    y = b; 
} 

int main() 
{ 
    abc a1; 
    cout << "A1 values: " << a1.ret_x() << "\t" << a1.ret_y() << endl; 
    abc a2(a1, 20); 
    cout << "A2 values: " << a2.ret_x() << "\t" << a2.ret_y() << endl; 

    return 0; 
} 

편집 :

사용 사례 :

문제는 그 객체의 A1이 자동 생성 따라서 수업 시간에 새로 도입 구성원이 업데이트 할 수 없습니다입니다. 새 멤버를 업데이트하는 멤버 함수를 제공 할 수는 있지만이 옵션을 탐색하려고했습니다.

코드가 제대로 작동하지만 올바른 방법입니까?

감사합니다.

+0

당신은 새로운 객체를 구성하고 - 새로운 객체가 자체에서 생성 할 때 의미가 만들 것? – chris

+0

나는 이와 같은 생성자를 보지 못했다. 복사 생성자는 다른 사람의 복사입니다. 그러나 당신은 하나의 멤버 변수에 대한 특별한 초기화를 포함합니다,이 코드는 복사 생성자의 상식을 깨뜨립니다. 왜 생성자는 초기 b 5가 아니라 생성자의 초기 b 0을 복사합니까? –

+0

@TongxuanLiu : 합계 사례 – Maddy

답변

2

chris가 이미 주석에 언급했듯이 완전히 새로운 개체를 만듭니다. 어떻게 this을 생성자로 전달하고 싶습니까? 아마도 새로운 배치를 통해 음, 사실, 당신은 할 수 :

abc a; 
abc* b = new(&a)abc(a); 

하지만 내가 그것을 고려하지 것 같은 이국적인 경우입니다, 나는 심지어 새로운 배치를 알아야 같은 고급 재료를 사용하여 누군가 항에 감히 그가 뭐하는거야 ... 그래서 체크를 하지마.

딥 복사가 필요한 데이터가 없기 때문에 특수한 경우에는 문제가없는 것으로 보입니다. 하지만 회원 b을 두 번 할당하고 있음을 알고 있어야합니다. int에서는 중요하지 않지만 더 큰 객체 (std :: string, std :: vector, ...)는 깊이있는 복사본을 만듭니다. 이것은 점점 더 의문의 여지가 있습니다.

(11) C++로하지만, 내가 생성자 위임을 선호하는 것 :

abc::abc(const abc& obj, int b) 
    : abc(obj) // copying here 
{ 
    y = b; 
} 

이 해결되지 않는, 그러나, 이중 할당 문제. 솔직히 말해서, 이것은 항상 정확한 문제가 아닐 수도 있습니다. 많은 경우 컴파일러가 첫 번째 과제를 최적화 할 수 있습니다 (특히 예제에서는 int). 그러나 더 복잡한 데이터 유형 (아마도 std :: string)에서 컴파일러가 쓸모없는 할당을 감지하는 데 익숙하지 않을 것입니다 ...

내부적으로 관리되는 리소스가 있으면 문제가 발생할 수 있다는 점에 유의하십시오. 필요한 전체 복사본 일

struct abc 
{ 
    int* array; 
    abc() : array(new int[7]) { } 
    ~abc() 
    { 
     delete[] array; 
    } 
} 

이 구현 변형에 따라 생성자 –을 적절한 할당 연산자를 제공하거나 복사하지, 당신 (과제) 또는 광산 (생성자 위임) –는 (정의 같은 여러 데이터 삭제 될 것 행동!). rule of three (또는 더 최근에는 rule of five) 다음에는 어쨌든 둘 다 필요합니다. 다음에 copy and swap idiom 관용구를 고려해보십시오.

마지막 트릭

이중 할당을 피하기 위해 :

abc(abc const& other) 
    : abc(other, other.y) 
{ } 

abc(abc const& other, int y) 
    : x(other.x), y(y) 
{ } 
+0

[ 3의 규칙] (https://en.wikipedia.org/wiki/Rule_of_three_ (C % 2B % 2B_programming))에 응답하는 동안. – user1336087

+0

@Aconcagua : 이런 식으로 일하는 유스 케이스를 추가했습니다. – Maddy