으엥,,,, 공부가 너무 하기 시러요,,,,
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이 되겠죠?
'CODING > C++ STUDY' 카테고리의 다른 글
C++ 독학 10일차 - 캐스팅, C++ 표준 문자열 (0) | 2021.08.07 |
---|---|
C++ 독학 9일차 - 오버로딩 (0) | 2021.07.29 |
C++ 독학 8일차 - String class(insert, erase, find 등) (0) | 2021.07.29 |
C++ 독학 7일차 - 디폴트 복사 생성자, 생성자 초기화 리스트, const, static, this 포인터 (0) | 2021.07.28 |
C++ 독학 6일차(7/24) - 소멸자, 복사생성자 (0) | 2021.07.26 |