만약 이런 코드가 있을 때
#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
명시적 변환을 할 경우 암시적 변환에서 되던 객체 생성의 형태도 안된다는 것을 알 수가 있다.
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; //변경 가능
}
};