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 과 클래스
첫째, main 함수가 호출되기도 전에 메모리 공간에 올라가서 초기화 된다. 따라서 public으로 선언이 된다면, 객체 생성 이전에도 접근이 가능하다.
둘째, 객체의 멤버로 존재하는 것이 아니다. 다만 선언되어 있는 클래스 내에서 직접 접근할 수 있는 권한이 부여된 것이다.
static 멤버는 위와같은 특징을 지닌다.
static 멤버의 초기화는 생성자가 적절하다 생각하겠지만, 이는 적절하지 않다. 왜냐하면 생성자는 객체 생성시 호출되지만, static 멤버는 main함수가 호출되기도 전에 초기화되어야 하기 때문이다.
그래서 static 멤버 초기화 문법적요소를 제공한다.
class Person {
static int count;
}
int Person::count=0; // 반드시 이렇게 초기화 해야한다.
* static 멤버의 특징
- 클래스 변수, 클래스 함수라 한다.
- main 함수 호출 이전에 메모리 공간에 올라가서 초기화 한다.(전역함수와 동일)
- 선언된 클래스의 객체내에 직접 접근 허용
- static 멤버 초기화문으로 초기화 해야한다.
6. 클래스 멤버로 상수를 정의하는 경우
class SoSimple
{
public:
const static int a=0;
const static int b=10;
};
cout<<SoSimple::a<<endl;
cout<<SoSimple::b<<endl;
이렇게
const static으로 선언된 변수는 선언과 동시에 초기화가가능합니다.
'0x0001 > C, C++' 카테고리의 다른 글
[C언어] 최대공약수, 최소공배수 (0) | 2019.02.08 |
---|---|
[C언어] 문자열 i am a boy -> yob a ma i -> boy a am i 변환 (0) | 2019.02.08 |
[C언어] 메모리 관리와 동적할당 (0) | 2019.02.08 |
[C언어] 함수 포인터, void형 포인터 (0) | 2019.02.07 |
[C언어] 다차원 배열, 다중 포인터 (0) | 2019.02.07 |