[C++] 5. 객체에 대한 const,static (클래스 변수, 클래스 함수)

2011. 5. 24. 12:13C++



[C++] 기초5 - const,static

1. const 초기화 방법

   const int id;
   int age;
   Person(int _id, int _age) : id(_id),age(_age)  //=> 메모리공간이 할당된후 바로 초기화(생성

자 호출전)
   {
 this->id = _id; //=> 생성자가 호출될때 초기화
   }

2. const 멤버 함수
   const로 생성한 함수내에서는 아래의 규칙을 따른다.

 - 멤버 변수의 값 변경 허용 안됨
   void show() const{
       age = 30; // 컴파일 에러, 변경 불가함
   }

 - 멤버 변수 값의 변경에 대한 기회제공도 불가
   int* getPtr() const{ // => const int* getPtr* const { 로 고치면 정상
       return &age; // 컴파일 에러, 주소를 전달하면 기회가 제공되므로 에러가 발생
   }

   void show() const{
       log(); // 컴파일 에러 발생, 해당 log함수내에서 age 변수를 조작할 가능성이 있기때문에
              // 에러가 발생한다. 만약 고치려면 log 함수도 const가 되어야 한다.
   }

   void log() {
       cout<<"age의 값="<<age<<endl;
   }


3. const 객체
 - 데이터의 변경이 허용되지 않는 객체
 - const 함수 이외에는 호출 불가
   const Person p;
   p.log(); // 이 log함수는 반드시 const로 선언되어 있어야 한다.

4. const와 함수 오버로딩
 const도 함수 오버로딩에 포함된다.
 즉 void log() const;
    void log();
 두 메소드를 작성해도 된다.

 

5. static 과 클래스
 - 전역 변수의 전역함수를 일부 대체하기 위해서 등장
 - 모든 객체가 공유할 수 있는 멤버
   class Person {
  static int count;
   }
   int Person::count=0; // 반드시 이렇게 초기화 해야한다.

 * static 멤버의 특징
  - 클래스 변수, 클래스 함수라 한다.
  - main 함수 호출 이전에 메모리 공간에 올라가서 초기화 한다.(전역함수와 동일)
  - 선언된 클래스의 객체내에 직접 접근 허용
  - static 멤버 초기화문으로 초기화 해야한다.

6. explicit & mutable
 * explicit : 명시적 호출만 허용합니다. 혼란방지를 위해

   explicit Person(int age) {
   }

   Person p1(10); // 컴파일 OK
   Person p2 = 10; // 묵시적으로 Person p1(10)으로 변환되므로 컴파일 에러(x)

 * mutable
   const에 예외를 둔다. 사용 비추천(x), 차라리 const 함수로 선언하지 않는게 낫습니다.

   mutable int value1;
   int value2;
   void log() const {
       value1 = 10; // mutable로 예외 허용했기때문에 OK
       value2 = 10; // 에러 발생
   }