- #include<iostream>
- using namespace std;
- class AAA
- {
- public:
- explicit AAA(int n){
- cout<<"explicit AAA(int n)"<<endl;
- }
- };
- int main(void)
- {
- //AAA a1=10; //C 스타일의 초기화 문법 에러 발생!!
- AAA a1(10); //C++ 스타일 초기화 문법
- return 0;
- }
explicit은 위에서 설명한거와 같이 여기에서 AAA라는 생성자가 명시적으로 호출될 지언정 묵시적으로 호출되는 것은 막겠다는 것인데, C++에서 일반적인 객체 생성 방법은 AAA a1(10); 으로 사용한다. 이 문장은 생성자를 명시적으로 호출하는 부분이다.
AAA a1=10; , AAA a1(10); 이 두개의 문장은 완전히 똑같은 문장이 아니고, AAA a1=10; 의 의미는 C++ 스타일 초기화 문법으로 묵시적으로 형변환이 되어서 완료가 되는 형태를 가지고 있다.
그래서 C 스타일 초기화 문법이 호출되는 방식이 C++ 스타일로 묵시적으로 변환이 되어서 호출 되니까, 이 경우에는 객체 생성 과정에 있어서 AAA 생성자를 묵시적으로 호출하는 것이 되므로, 컴파일 에러가 난다. (묵시적 호출을 막고 있는 키워드 explicit을 사용하고 있으므로)
explicit이라는 문법이 필요한 이유는 C 스타일의 초기화 문법 자체가 혼란 스러울 수 있으므로, 클래스 생성자의 선언 및 사용을 할시에는 explicit을 써주는것이 좋다.
mutable : const로 선언되어 있는 함수 내에서, 멤버 변수의 조작 가능한 변수로 선언하겠다는 의미
- #include<iostream>
- using std::cout;
- using std::endl;
- class AAA
- {
- private:
- mutable int val1;
- int val2;
- public:
- void SetData(int a, int b) const
- {
- val1=a; // val1이 mutable이므로 OK!
- val2=b; // Error!
- }
- };
- int main(void)
- {
- AAA a1;
- a1.SetData(10, 20);
- return 0;
- }
앞서 const에 대한 저자의 포스팅을 봤다면, mutable은 거의 쓸일이 없는 문법이라는걸 눈치 챘을 것이다.
댓글 없음:
댓글 쓰기