의도치 않은 암시적 변환을 할수 없도록 컴파일러에 명시해둘 수 있음
DoSomethingString(MyString s){ // do Someting .. }
DoSomethingString(MyString("abc"));
DoSomethingString("abc");
명시적 이라는 뜻. 암시적 과 반댓말.
암시적변환을 막는 키워드이다.
변환이 아무때나 되면 예상치 못한 오작동을 일으킨다.
// explicit 생성자
explicit MyString(int capcity);
...
`DoSomethingString(MyString s){
// do Someting ..
}
...
// main()
DoSomethingWithString(3); // <- 오류
MyString s(5); // 허용
MyString s = 5; // 컴파일 오류!
변이가능한! 이라는 뜻의 지정자. const
로 되어있는 친구들도 전부 바꿀 수 있게 만들어버림.
class A{
int data_;
public :
A(int data) : data_(data){}
void DoSomething(intx) const{
data = x; // 상수 함수(const)(읽기만가능)로 해놓곤, 변수를 수정해?? 당연히 오류 뜸.
}
...
class A{
mutable int data_;
public :
A(int data) : data_(data){}
void DoSomething(intx) const{
data = x; // 상수 함수(const)(읽기만가능)로 해놓곤, 변수를 수정해?? >> 근데 변수가 mutable... 원하는 값이 나온다.
}
...
아니근데 왜 const 함수의 용도인 '읽기'에서 '변경'으로 억지로 고쳐가며 왜 mutable 까지 써가면서 써야하냐...?
서버를 가지고 예를 들어보자