explicit 과 mutable

MwG·2024년 11월 17일

C++

목록 보기
5/14

Explicit

만약 이런 코드가 있을 때


#include <iostream>
#include <cstring>


class A {


	int a;
	

public:

	A(int x)
	{
		a = x;
	
	};
	

	int Geta() { return a; }

};

void Implicit(A a)
{
	std::cout << "Implicit!" << std::endl;
}


int main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(NULL);
	std::cout.tie(NULL);
	

	Implicit(A(6));
	Implicit(5);


	return 0;
}

Implicit함수는 인자로 class인 A를 받아야하는데 밑에 코드에는 5를 넣었을 때도 정상적으로 작동하는 것을 알 수가 있다. 기본적으로 5가 암시적 변환(Implicit Conversion)을 하기 때문에 5에 해당하는 생성자를 찾아 변환이 되었기 때문이다.

이때 explicit이라는 키워드를 통해 이를 방지할 수 있는데

explicit A(int x)
{
	a = x;

};

생성자에 explicit키워드를 붙일 경우 위 코드에서 오류가 발생하는 것을 알 수가 있다.

또한 객체를 생성할 때도

	A a(6); //명시적으로 생성자 호출할 경우에만 O
	A a = 6; //명시적 변환에선 X

명시적 변환을 할 경우 암시적 변환에서 되던 객체 생성의 형태도 안된다는 것을 알 수가 있다.

mutable

const 멤버 함수를 선언하였을 경우 멤버 변수의 값을 변경하는 것이 불가능하다.


class A {

	int a;

public:

	
	void CONSTFunc(int x) const //불가능
	{
		 a = x;
	}

};

이때 변수에 mutable 키워드를 선언할 경우 const 멤버 함수에서도 값을 변경할 수 있게 된다.

class A {

	mutable int a;

public:

	
	void CONSTFunc(int x) const
	{
		 a = x; //변경 가능
	}

};

0개의 댓글