본문 바로가기
C++

클래스와 const

by 상레알 2009. 1. 14.
 
const !

첫째! const키워드는 변수의 선언앞에서 붙어서 변수를 상수화 한다.

둘째! const 키워드는 포인터가 가리키는 데이터를 상수화한다.

int n =10;
const int* p =&n;
*p = 20 ;   //   컴파일 오류
p를 가지고 접근을하는것은 오류지만 n의 값을 바꿀수는 잇다..
셋째! const키워드는 포인터 선언시 이름 앞에 붙어서 포인터 자체를 상수화 한다.
int n1 = 10 ;
int n2 = 20 ;
int* const p = *n1 ;
*p = 20;
p = &n2;    // 컴파일오류

p를 상수화 시켜서 가리키는것을 바꾸지 못함....


멤버 이닐셜라이저   :  몸체 부분이 실행되기 이전에 실행이 된다 // 생성자 몸체보다 먼저 실행되게하여 const멤
                                                                                  버 초기화 용도로도 사용할수도잇다.

                            student( ....) : id(_id)    <- "student 생성자 함수 가 실행되기 이전에 멤버변수 id를 매
                                                                  개변수 _id로 초기화하라 "

참고로 이니셜라이저에서는 둘이상의 const 멤버를 ,(콤마)연산자를 이용해서 구분 지어 초기화 할 수 있으며 const 멤버 변수가 아닌 일반 멤버 변수도 초기화가 가능하다.


const함수는 즉 상수화된 함수는

! 멤버 변수의 값 변경을 허용하지 않는다

! 멤버 변수 값의 변경에 대한 기회 제공도 불가

! 상수화 되지 않은 함수의 호출을 허용하지 않을 뿐만 아니라, 멤버 변수의 포인터를 리턴하는 것도 허용하지 않는다.
-멤버 변수를 조작할 능력(가능성)을 지니고 잇을 경우 도 허용하지 않는다!!

아래 소스는 상수화 함수에 관한것이다 잘 살펴보도록하자


class count{
 int cnt;
public:
 count() :cnt(0){}
 /*const*/ int* GetPtr() const {
  return &cnt;                                     //컴파일 오류발생
 }
 void Increment(){
  cnt++;
 }
 void ShowData() /*const*/{
  ShowIntro();                                    //컴파일오류발생 
  cout<<cnt<<endl;
 }
 void ShowIntro()const{
  cout<<"현재 count의 값:" <<endl;
 }
};

const 객체!!

객체가 상수화되면, 어떠한 경로를 통해서든 멤버 변수의 조작은 불가능해진다. 뿐만 아니라 상수화된 멤버 함수만 호출이 가능해진다.
일단 멤버 함수는 멤버 변수를 조작하지 않더라도 호출 불가능하다.

그리고  상수 함수냐 아니냐에 따라서 함수 오버로딩은 성립한다.

또한  상수화되지 않은 함수 가 상수 함수 보다 우선순위가 높다 !!!


'C++' 카테고리의 다른 글

상속을 하는 이유  (0) 2009.01.16
protected 멤버  (0) 2009.01.15
상속!!  (0) 2009.01.15
explicit &&&& mutable  (0) 2009.01.15
클래스와 Static  (0) 2009.01.15
복사 생성자가 호출되는 시점  (0) 2009.01.08
복사생성자  (0) 2009.01.08
const 함수  (0) 2009.01.06
friend 선언  (0) 2009.01.06
This 포인터  (0) 2009.01.06