프로그래밍 언어/C & C++ 정리

C++ 생성자 (constructor)와 소멸자 (destructor)

뽀또치즈맛 2023. 1. 25. 14:41

생성자는 그 클래스의 객체가 생성될 때 

 

복사 생성자 역할
- 디폴트 복사 생성자는 static 멤버를 제외한 멤버들을 멤버별로 복사한다. 각 멤버는 값으로 복사된다.
- 멤버별 복사 또는 얕은 복사라고 부른다.
- 클래스가, 새로운 객체가 생성될 때마다 값이 변하는 static 데이터 멤버를 가지고 있다면, 
그 상황을 처리하는 명시적 복사 생성자를 제공해야한다.
- 프로그램이 복사 생성자를(명시적or암시적) 사용하지 않으면, 
컴파일러는 함수 정의가 아니라 원형만 제공한다.

복사 생성자 사용 하는 곳
- 새 객체를 동일한 클래스이 다른 객체로 초기화할 때
- 객체가 함수에 값으로 전달될 때
- 함수가 객체를 값으로 리턴할 때
- 컴파일러가 임시 객체를 생성할 때

디폴트 생성자
- 인수를 취하지 않는 생성자를 디폴트 생성자라고 부른다.
(초기화 값을 제공하지 않을 때 객체를 생성하는 생성자)
- 얕은 복사를 수행하게 된다.
- 어떤 멤버 변수의 값과 주소가 모두 같다는 의미

디폴트 복사 생성자
- 복사 생성자를 만들지 않는 경우 자동으로 생성, 호출되는 생성자
- 각 멤버 변수의 값을 복사하는 방식으로 생성된다.

 

먼저 생성자와 파괴자는 클래스를 설계할 때 사용한다.

생성자, 파괴자는 둘 다 표준 함수이다.

일반적으로 모든 객체는 그것을 생성할때 초기화하는 것이 바람직하다.

 

복사 생성자 ( = copy constructor )

 

복사 생성자 ( = copy constructor )는

다른 객체를 이용하여 같은 클래스의 객체를 초기화하는 것인 멤버 함수(= 메서드 ) 이다.

간단히 말하면, 이전에 생성된 동일한 클래스의 객체로 초기화하여

객체를 생성하는 생성자를 복사 생성자라고 한다.

 

복사 생성자의 특성

 

1. 복사 생성자는 기존 객체의 멤버를 복사하여 새로 생성된 객체의 멤버를 초기화하는 데 사용된다.

 

2. 복사 생성자는 인수와 동일한 클래스의 개체를 참조한다.

 

3, 이러한 객체의 멤버 초기화 과정을 통해 복사 생성자는 복사 초기화라는 것을 알수 있다.

( = 3. The process of initializing members of an object through a copy constructor is known as copy initialization. )

 

4. 이것은 또한 멤버의 광범위한 초기화라고 부른다. 왜냐하면 이 복사 생성자 초기화는

하나의 객체를 기존의 객체로 초기화하기 때문에,

둘 다 멤버별 복사본을 기준으로 동일한 클래스에 속한다.

 

5. 복사 생성자는 명시적으론 프로그래머에 의한 것이라고 정의할 수 있다.

만약 프로그래머가 복사 생성자를 정의하지 않는다면,

컴파일러는 우리를 위해 복사 생성자를 정의할 것이다. 

 

// C++ program to demonstrate the working
// of a COPY CONSTRUCTOR
#include <iostream>
using namespace std;
  
class Point {
private:
    int x, y;
  
public:
    Point(int x1, int y1)
    {
        x = x1;
        y = y1;
    }
  
    // Copy constructor
    Point(const Point& p1)
    {
        x = p1.x;
        y = p1.y;
    }
  
    int getX() { return x; }
    int getY() { return y; }
};
  
int main()
{
    Point p1(10, 15); // Normal constructor is called here
    Point p2 = p1; // Copy constructor is called here
  
    // Let us access values assigned by constructors
    cout << "p1.x = " << p1.getX()
         << ", p1.y = " << p1.getY();
    cout << "\np2.x = " << p2.getX()
         << ", p2.y = " << p2.getY();
    return 0;
}

 

결과 값

p1.x = 10, p1.y = 15
p2.x = 10, p2.y = 15

 

복사 생성자의 유형

 

1. 디폴트 복사 생성자

 

2. 유저가 정의한 복사 생성자

 

이 두가지 이다.