본문 바로가기
c++

컴파일러가 자동으로 만들어 주는 함수들을 알아보자.

by chunma1126 2025. 1. 14.

 

 

Cpp에서는 우리가 선언하지 않아도 컴파일러가 자동으로 필요에 의해 만들어 주는 함수들이 있다.

 

생성자,

소멸자,

복사 연산자,

복사 대입 연산자

 

이렇게 4개의 함수들을 말이다.

 

다음 예제 코드를 보며 설명해 주도록 하겠다.

#include <iostream>
using namespace std;

class MyClass
{
public:
	string name;

	void Print() 
	{
		cout << name << endl;
	};
};

int main()
{
	MyClass m;
	m.name = "123";

	MyClass m2(m);
	m2 = m;

	m.Print();
	m2.Print();

}

 

MyClass를 보면 생성자가 없지만 정상적으로 생성할 수 있고 복사 연산자와 복사 대입 연산자가 없는데 코드에서 오류가 안나지 않는가?

 

그 이유는 컴파일러가 자동으로 만들어 주기 때문인 것이다.

 

컴파일러가 자동으로 만들어 주는 경우는 다음 두 조건을 만족할 때만이다.

 

1.해당 멤버 함수가 클래스 내에 명시적으로 선언되어 있지 않을때

2.해당 멤버 함수가 코드에서 실제로 사용될 때

 

위 조건을 모두 만족할 때 컴파일러가 자동으로 만들어 준다.

 

그런데 만약 복사 연산자와 복사 대입 연산자가 없어야 하는 상황이라면 어떨까?
보통 일반적인 경우에는 선언하지 않으면 그 함수는 존재하지 않는다.

 

하지만 위 함수들은 내가 선언하지 않아도 자동으로 만들어 주는데... 어떻게 해야 할까?

해결 방법은 의외로 간단하다.

 

복사 연산자와 복사 대입 연산자를 private로 선언하는 것이다.

#include <iostream>
using namespace std;


class MyClass
{
private :
	MyClass(const MyClass& other);
	MyClass& operator= (const MyClass& other);

public:
	string name;

	void Print() 
	{
		cout << name << endl;
	};
};

int main()
{
	MyClass m;
	m.name = "123";

	MyClass m2(m);
	m2 = m;

	m.Print();
	m2.Print();

}

 

다음 코드에서는 오류가 날것이다.

 

왜냐하면 Private로 선언된 함수를 외부에서 접근하려고 하기 때문에 그렇다.

 

이렇게 하면 컴파일러가 자동으로 만들어 주지 않고 우리가 만든 연산자들을 사용하지만 구현되어 있지 않기 때문에 오류가 난다.

 

이렇게 구현할수도 있고 Uncopyable이라는 기본 클래스를 만들어서 거기서 파생 클래스를 만들어 사용할수도 있다.

#include <iostream>
using namespace std;

class Uncopyable 
{

private:
	Uncopyable(const Uncopyable&);
	Uncopyable& operator=(const Uncopyable&);

};

class MyClass : private Uncopyable
{
public:
	string name;
	void Print() {
		cout << name << endl;
	}
};

 

이렇게 구현할 수도 있다.

기본 클래스의 함수들을 숨기기 위해 private로 상속을 받아야 한다.

 

 

 

컴파일러가 자동으로 이런 일들을 해주다니 공부하면서 좀 신기했당.