변수에 다른 변수의 값을 대입하기 위해서는 대입 연산자를 사용하며 이는 복사라고 볼 수 있다. 하지만 대입 연산자를 이용한 복사는 얕은 복사로 수행된다.
얕은 복사란 값을 복사하는 것이 아닌 값을 가리키는 포인터를 복사하는 것이다. 따라서 변수 생성에서는 문제가 되지 않지만 객체에서는 문제가 발생할 수 있다.
복사 생성자란 자신과 같은 클래스 타입의 다른 객체에 대한 참조를 인수로 전달받아, 그 참조를 가지고 자신을 초기화하는 방법이며 깊은 복사를 수행한다.
이는 새롭게 생성되는 객체가 언본 객체와 같으면서도, 완전한 독립성을 가지게 해준다.
문법클래스이름(const 클래스이름&)
#pragma warning(disable : 4996)
#include <iostream>
#include <cstring>
using namespace std;
class Person {
private:
float _height;
float _weight;
char* _name;
public:
Person() { }
Person(float height, float weight, const char* name)
: _height(height), _weight(weight), _name(new char[strlen(name) + 1]) {
strcpy(_name, name);
}
Person(const Person& person)
: Person(person._height, person._weight, person._name) {
}
// 새로 할당을 함으로써 복사하는 객체들이 각각 다른 메모리를 가리키게됨
~Person() {
delete[] _name; // 원형 값을 해제하여서 복사한 값들이 없어짐
}
Person& operator=(const Person& person) {
_weight = person._weight;
_height = person._height;
delete[] _name;
_name = new char[strlen(person._name) + 1];
strcpy(_name, person._name);
return *this;
}
void print() const {
cout << _name << endl;
cout << _height << endl;
cout << _weight << endl;
}
};
int main() {
Person person0{ 162, 42, "tomdddddddddddddddddd" };
Person person1;
Person person2;
person2 = person1 = person0;; // 대입 연산자
person0.print();
person1.print();
person2.print();
}
tomdddddddddddddddddd
162
42
tomdddddddddddddddddd
162
42
tomdddddddddddddddddd
162
42