C++ 연산자 오버로딩 - 대입 연산자 오버로딩, 복사 생성자

진경천·2023년 9월 27일
0

C++

목록 보기
48/90

대입 연산자

변수에 다른 변수의 값을 대입하기 위해서는 대입 연산자를 사용하며 이는 복사라고 볼 수 있다. 하지만 대입 연산자를 이용한 복사는 얕은 복사로 수행된다.

얕은 복사 (shallow copy)

얕은 복사란 값을 복사하는 것이 아닌 값을 가리키는 포인터를 복사하는 것이다. 따라서 변수 생성에서는 문제가 되지 않지만 객체에서는 문제가 발생할 수 있다.

복사 생성자

복사 생성자란 자신과 같은 클래스 타입의 다른 객체에 대한 참조를 인수로 전달받아, 그 참조를 가지고 자신을 초기화하는 방법이며 깊은 복사를 수행한다.
이는 새롭게 생성되는 객체가 언본 객체와 같으면서도, 완전한 독립성을 가지게 해준다.

문법

클래스이름(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

profile
어중이떠중이

0개의 댓글