본문 바로가기
CODING/C++ STUDY

C++ 독학 8일차 - explicit, mutable

by pharmerci 2021. 7. 29.
728x90

으엥,,,, 공부가 너무 하기 시러요,,,, 

 


explicit

예를 들어서

void something(mystring s) {

 어쩌구 저쩌구

}

 

이런 함수가 있다고 하자..

그랬을 때 something(mystring("abc")); 이건 오류가 아니다. 객체를 만들어서 인자로 전달하니까.

 

something("abc"); 이거는 mystring 타입이 아닌데 mystring 생성자 중에서 mystring(const char* str);

이게 있으니까,, (8일차 코드들을 참고해주세요:-))

얘네가 알아서 something(mystring("abc")); 이런식으로 알아서 컴파일을 한다

저번에 얘기한 것 같은데 이런 것을 암시적 변환이라고 한다.

 

만약 something(3); 이런 코드는 정수 데이터를 전달하고 있는데 문자열을 받는 함수기 때문에 좀 안맞는다.

그런데 이건 오류가 나지 않는다.

왜냐하면 mystring(int capacity); 라는 생성자가 있어서 얘네가 알아서

something(mystring(3));으로 변환되어 컴파일된다.

이건 사용자가 의도하지 않은 암시적 변환이다.

 

C++에서는 원하지 않는 암시적 변환을 막기 위해서 컴파일러에게 명시해줄 수 있다.

explicit을 이용해서.

 

생성자를 써줄 때 앞에다가 explicit을 선언해두면 암시적변환을 못하게 막을 수 있다.

explicit mystring(int capacity);

이런식으로 선언해주자!

그러면 something(3); 이런거 실행하면 오류난다. 암시적변환 못하니께!

 

 

 

 


mutable

const 함수 내부에서는 멤버 변수 값을 바꾸는게 불가능했다. 그런데 이때 멤버변수를 mutable로 선언하면 const 함수에서도 값을 바꿔줄 수 있다.

 

원래는 이런데!

 

 

 

 

이렇게 변수를 정의할 때 앞에 mutable을 붙여주면 정상적으로 실행된다.

출력은 3이 되겠죠?

 

 

 

728x90