본문 바로가기

Language/C++

const 멤버 변수 & 멤버 이니셜라이져

이 글은 열혈강의 C++ 강의를 들으면서 공부를 하면서 정리한 글이다.

cosnt  : const 키워드를 붙이고 변수 또는 함수를 기제하면 그 값을 상수화 시켜서 변경을 불가능하게 만든다.
이는 프로그램을 보다 안정적이게 만들어 주는 기능이다.
특히 C++에서는 객체개념이 들어가기 때문에 const가 생각보다 유용하게 사용될수도 있다.특히 C++에서는 객체개념이 들어가기 때문에 const가 생각보다 유용하게 사용될수도 있다.

기본적으로 문법은 다음과 같다.
<const 자료형 변수명;>

포인터변수를 사용하게 되면 위치에 따라 상수화 되는 내용이 달라진다.

int *const pt = &a;  ==> pt가 가리키는 a의 내용을 상수화 한다. 물론 a라는 변수로 내용 변경에 대한
제약은 받지 않는다. 하지만 *pt  = 10; 과 같은 식으로 역참조 연산을 사용하여 내용을 변경하려고
한다면 compile 에러를 이르킨다.

const int* pt = &a; // pt 자체를 상수화 시킨다. 이는 pt로 역참조 하여 값을 변경하는 구문에 대해선
제약을 받지 않지만 pt = &b; 와 같은 구문에서 변경을 허가하지 않는다. 즉, 한번 가리킨 포인터를 변경
할수 없도록 하는 것이다.

물론 위의 두구문을 합쳐서 사용이 가능하다. const int* const pt = &a; 이는 참조가 가능하지만 값의 변경
이 불가능 하게 하며, pt역시 다른 포인터를 가리킬수 없도록 만든것이다.

cosnt 멤버 변수 사용예

class Student
{
    const int id;//초기화후 변경할수 없도록 cosnt 로 상수화 시킨것이다.
    int age;
    char name[20];
    char major[30];

public:
    Student(int _id,int _age,char* _name, char* _major)//하지만 실행시 id 부분은 쓰래기 값으로 초기화가 되버린다.
    {//생성자 함수로 초기화가 불가능하다. 이미 쓰래기 값으로 상수화가 되어버린다.
        id = _id;
        age = _age;
        strcpy(name, _name);
        strcpy(major,_major);
    }
위 구문은 const 멤버 변수 사용의 예를 나타낸것인데 private구문에서 id를 상수화 시킨것인데 이는 id를 초기화 한후
변경을 하지 않기 위해서 사용 한것이다. 하지만 이 구문에서 NG는 생성자 함수가 초기화를 시키기 전에 이미 쓰래기
값으로 초기화가 되어버린다는 엄청난 풰이크가 숨어있다는거.ㅡ.ㅡ 이를 방지 하기 위해서 멤버이니셜라이져(memder initializer)를 사용한다.
바로 생성자 함수 해더 부분에 멤버이니셜라이저 구문을 추가 해주는 것이다.
Student(int _id,int _age,char* _name, char* _major):id(_id)<--바로 여기 부분.
이 부분은 id를 _id로 초기화를 시키겠다는 일종의 약속된 문법이다.

const 객체
이건 솔직히 별거 없는듯 하다. const객체는 const 멤버 함수만 호출이 가능하다! 라는거 빼고는 .ㅡㅡ;; 특별한건 상수화된 개념뿐이다. 현재로서는 여기까지....