본문 바로가기
IoT 디바이스 활용/C++

C++ - 복사생성자와 정적멤버

by cooluk 2020. 10. 12.

복사생성자와 정적멤버


함수로 객체 전달하기

  • 객체를 함수로 전달하기

    • 함수 호출 시 객체를 매개변수로 전달하면 객체의 복사가 일어남
    image-20200909221433954
  • 객체의 주소를 함수로 전달하기

    • 함수 호출시 객체의 주소를 전달하면 객체의 복사가 일어나지 않음
    image-20200909221451425

  • 참조자 매개변수 사용하기

    • 효과는 포인터를 넘기는 것과 동일하나 포인터 보다 가독성이 좋아짐
    image-20200909221522045
  • 함수가 객체를 반환

    • 객체를 함수의 매개변수로 전달할 때와 같이 객체의 복사가 일어남
    • Pizza pizza = createPizza(); // 이런 함수를 팩토리 함수라고 한다.
    image-20200909221614566

  • 복사 생성자가 사용되는 시점

    • 함수의 매개변수로 객체를 전달할 때
    • 객체를 대입할 때
    image-20200909222421714
  • 복사 생성자

    MyClass(const MyClass & other){ // 복사생성자의 매개변수타입은 지정되어있다.
        // 객체 초기화               // 반드시 참조변수(&)로 받아야 한다
    }
    • MyClass(MyClass other)로 하면 무한 루프 발생하므로 주의!
    • 복사 생성자를 정의하지 않으면 자동으로 추가
      • 멤버 변수에 대한 얕은 복사 진행
    • 깊은 복사가 필요한 경우 복사 생성자 정의 필요


  • 복사 생성자

    • 얕은 복사와 깊은 복사

      • 얕은 복사 - 참조되는 주소값을 복사하여 주소값에 있는 값을 참조
      • 깊은 복사 - 참조되는 값까지 복사하여 그 값을 참조
      image-20200909222449479

복사 생성자 - 디폴트 복사 생성자

#include <iostream>
#include <string>
using namespace std;
class Person
{
    public:
    int age;
    Person(int a) : age(a) {}
};

int main(int argc, char const *argv[])
{
    Person kim{21};
    Person clone{kim}; // 복사 생성자 호출
    cout << "kim의 나이: " << kim.age << " clone의 나이: " << clone.age << endl;
    kim.age = 23;
    cout << "kim의 나이: " << kim.age << " clone의 나이: " << clone.age << endl;
    return 0;
}

kim의 나이: 21 clone의 나이: 21
kim의 나이: 23 clone의 나이: 21



복사 생성자 - 얕은 복사의 문제점

#include <iostream>
#include <string>
using namespace std;

class MyArray{
    public:
    int size;
    int *data;
    MyArray(int size){
        this->size = size;
        data = new int[size];
    }
    ~MyArray(){
        if(data != NULL){
            delete []data;
        }
    }
};

int main(int argc, char const *argv[]) {
    MyArray buffer(10);
    buffer.data[0] = 1;
    {
        MyArray clone = buffer; // 복사 생성자 호출
    } // clone 삭제
    buffer.data[0] = 2;
    cout << buffer.data[0] << endl;
    return 0;
}

2



  • MyArray clone = buffer; // 복사 생성자 호출
image-20200909222832358 image-20200909222846547

복사 생성자 - 깊은 복사

class MyArray{
    public:
    int size;
    int *data;
    MyArray(const MyArray& other){
        size = other.size;
        data = new int[other.size];
        for(int i=0; i<size; i++){
            data[i] = other.data[i]; // 복사 생성자 호출
        }
    }
    ~MyArray(){
        if(data != NULL){
            delete []data;
        }
    }
};
image-20200909223241448

'IoT 디바이스 활용 > C++' 카테고리의 다른 글

C++ - 상속  (0) 2020.10.12
C++ - 객체의 동적 생성  (0) 2020.10.12
C++ - 동적 할당 메모리  (0) 2020.10.12
C++ - 포인터  (0) 2020.10.12
C++ - 객체 배열, 벡터  (0) 2020.10.12

댓글