2016년 3월 9일 수요일

[c++] explicit, mutable


 explicit : 명시적 호출만을 허용
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. class AAA  
  5. {  
  6. public:  
  7.     explicit AAA(int n){  
  8.         cout<<"explicit AAA(int n)"<<endl;  
  9.     }  
  10. };  
  11.   
  12. int main(void)  
  13. {  
  14.     //AAA a1=10; //C 스타일의 초기화 문법  에러 발생!!  
  15.       
  16.     AAA a1(10);  //C++ 스타일 초기화 문법  
  17.   
  18.     return 0;  
  19. }  
  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로 선언되어 있는 함수 내에서, 멤버 변수의 조작 가능한 변수로 선언하겠다는 의미
  1. #include<iostream>  
  2. using std::cout;  
  3. using std::endl;  
  4.   
  5. class AAA  
  6. {  
  7. private:  
  8.     mutable int val1;  
  9.     int val2;  
  10.   
  11. public:  
  12.     void SetData(int a, int b) const   
  13.     {  
  14.         val1=a;  // val1이 mutable이므로 OK!  
  15.         val2=b;  // Error!  
  16.     }  
  17. };  
  18.   
  19. int main(void)  
  20. {  
  21.     AAA a1;  
  22.     a1.SetData(10, 20);  
  23.     return 0;  
  24. }  
앞서 const에 대한 저자의 포스팅을 봤다면, mutable은 거의 쓸일이 없는 문법이라는걸 눈치 챘을 것이다. 

댓글 없음:

댓글 쓰기

[Effective C++] 항목 30 : 인라인 함수는 미주알고주알 따져서 이해해 두자.

인라인 함수를 사용하면 컴파일러가 함수 본문에 대해 문맥별 최적화를 걸기가 용이해집니다. 인라인 함수의 아이디어는  함수 호출문을 그 함수의 본문으로 바꿔치기하자는 것  남발했다가는 코드의 크기가 커질 게 뻔하다. 인라인 함수로 부풀려진 ...