2011. 5. 24. 12:13ㆍC++
[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; // 에러 발생
}