생성자 ( Constructor )
객체가 생성될 때 초기화하는 함수
오버로딩이 가능하다
- 디폴트 생성자
작성한 생성자가 없을 경우 컴파일러에 의해서 자동으로 만들어지는 생상자
매개변수가 없거나 초기화된 매개변수를 가지고 있다
클래스 하나에 하나의 디폴트 생성자가 있다
class Example
{
public:
Example();
Example(int a = 0);
};
int main()
{
Example e; // Error!!
return 0;
}
▶ 디폴트 생성자가 두 개라서 생기는 오류
class Example
{
public:
Example();
Example(int a);
};
int main()
{
Example e; //디폴트 생성자 호출
Example e(10); //생성자 호출
return 0;
}
- 복사 생성자
한 객체의 내용을 다른 객체로 복사하여 생성된 생성자
자신과 같은 타입의 객체를 인자로 받는다
같은 클래스에 객체로 초기화할 때 호출한다
class Example
{
public:
Example(const Example& e);
};
▶ 복사 생성자의 기본 형식
객체를 복사해야하기 때문에 레퍼런스(&)가 아닌 call-by-value로 넘기면 비효율적이다
- 디폴트 복사 생성자
작성된 복사 생성자가 없을 경우 컴파일러가 자동으로 디폴트 복사 생성자를 생성한다
얕은 복사를 수행한다
얕은 복사와 깊은 복사 (Shallow Copy & Deep Copy)
- 얕은 복사
객체의 멤버들을 복사할 때 객체에 참조 타입의 멤버가 있다면 참조값만 복사한다
동적 할당을 받은 변수의 주소값만 공유한다
#include <iostream>
using namespace std;
class Example
{
public:
int size;
int* data;
Example(int size)
{
this->size = size;
data = new int[size];
}
Example(const Example& other)
{
this->size = other.size;
this->data = other.data;
}
};
int main()
{
Example buffer(10); //생성자 호출
buffer.data[0] = 2;
Example buffer2 = buffer; //복사 생성자 호출
buffer.data[0] = 3;
cout << "buffer2.data[0] = " << buffer2.data[0] << endl;
return 0;
}
결과

이처럼 얕은 복사 수행시 주소값을 공유하게 된다
- 깊은 복사
깊은 복사는 모든 멤버를 복사한다
객체에 참조 타입이 있을 경우 참조된 객체 자체를 복사한다
동적 할당을 새로 받고 원본 데이터를 복사한다
별도의 메모리 공간을 확보하고 내용을 복사한다
추가 객체의 생성이 필요하여 비용이 더 든다
#include <iostream>
using namespace std;
class Example
{
public:
int size;
int* data;
Example(int size)
{
this->size = size;
data = new int[size];
}
~Example()
{
if (this->data == NULL)
delete[]data;
}
Example(const Example& other)
{
this->size = other.size;
this->data = new int[size]; //새로운 객체 생성
for (int i = 0; i < other.size; i++)
{
this->data[i] = other.data[i];
}
}
};
int main()
{
Example buffer(10);
buffer.data[0] = 2;
Example buffer2 = buffer;
buffer.data[0] = 3;
cout << "buffer2.data[0] = " << buffer2.data[0] << endl;
return 0;
}
결과

이처럼 깊은 복사는 복사한 대상이 바뀌어도
서로 다른 메모리 공간을 참조하기에 복사된 객체는 아무 영향을 받지 않는다
깊은 복사 후에는 개별적인 객체가 된다

'> 개념' 카테고리의 다른 글
| [C++] 가상 함수 (0) | 2024.02.05 |
|---|---|
| [게임 수학] 벡터의 내적과 외적 활용 (0) | 2024.01.06 |
| [C++] 변수와 메모리 공간 (0) | 2023.11.24 |
| [C++] #pragma pack (0) | 2023.06.24 |
| [게임 수학] 사원수 (Quaternion) (0) | 2023.06.04 |