。공부 。

<C++> Const & Initializer(이니셜라이져)

kyoe 2007. 12. 7. 23:47
Const는 변수를 상수화 하고 Initializer(이니셜라이저)는 Const로 상수화된 변수를 초기화할때 쓰인다.

[ Const의 의미 ]

- const aa = 10;
aa변수앞에 const를 붙여주면 aa변수는 10이라는 하나의 상수가 되는것이다.
이때 상수화된 변수 aa를 aa = 50; 이렇게 쓰면 에러가 발생하게 된다 컴파일러는 소스를 해석할때 변수aa = 50 이 아니라 10 = 50 으로 해석하기 때문이다. 상수 10에 50을 넣을수는 없는일 아닌가?

[ 포인터를 상수화 ]
- const int* n = age;
데이터상수화라고 한다.
포인터(*n)로 접근해서 데이터의 값을 변경할수없다.
하지만 포인터n이 가리키고있는 변수age는 변경할수있다.
*n =  20;       // (X)
age = 10;      // (O)

- int* const n = age;
이경우엔 포인터 상수화라고하는데 말그대로 포인터를 상수화 한것이다 포인터가 가르키는 주소의 값을 변경할 수 없다.
n = &name;   //(X)
*n = 30;        //(O)

- const int* const n = age;
위와 같이 const를 앞뒤에 붙여주면 포인터(*n)로 값을변경하거나 포인터가 가르키는 주소값을 변경하는 연산을 하지못한다. 즉 데이터상수화 포인터상수화가 동시에 되는것이다.

[ Initializer(이니셜라이저) ]
Initializer는 상수화 된 변수를 초기화할때 사용하는데 딱히 함수가 있는것이아니라 아래와 같이 코딩했을때 이것을 Initializer라 하는것이다.

class Student{
    const int id;
public:
    Student(int _id):id(_id){ //상수화된 변수를 초기화하고 있다.(이니셜라이저)
      // id = _id;                //주석을 풀면 에러
    }
};

int main(void){
    Student kyoe(2007);
    return 0;
}

위와 같이 상수화된 변수 id를 생성자안에 id = _id 이렇게 써주면 컴파일타임에 에러가 발생한다  변수id는 상수화가 되었기때문이다 하지만 id = _id 이부분을 주석처리하고 생성자함수 바로 옆에 접근연산자 ' : '를 붙여주고 id(_id)를 써주게 되면 상수화된 변수 id를 초기화 할수 있다.
Student(int _id):id(_id){} 이런식의 코딩을 우리는 이니셜라이져라 하는것이다.
Initializer는 생성자가 호출되기이전에 실행이 된다고 생각하면 된다.
즉 객체를 만들때 메모리가 할당된후 쓰래기 값이 채워지기 전에 실행이 되는것이다.

[ Const 멤버 함수 ]
- 멤버변수의 값 변경을 허용하지 않는다.
- 멤버변수 값의 변의 변경에 대한 기회제공도 불가.

class Student{
    int age;
    int size;
public:
    Student(int _age,int _size){
       age = _age;
       size = _size;
    }
    void ShowStart() const{
        cout<<"출력"<<endl;
        ShowData();         //ShowData();함수가 상수화 되어있지않으면 에러발생
    }
                               
    void ShowData() const{       //멤버함수를 상수화
        //age=20;                    //멤버함수가 상수화 되었으므로 멤버변수의 값을 수정하지 못한다.
        cout<<"사이즈: "<<size<<endl;    //값을 참조해 출력만 가능
    }
};

int main(void){
    Student kyoe(24,100);
    kyoe.ShowStart();
    return 0;
}
ShowStart()함수는 현재 상수화 되어 있다 앞에서 말했듯이 상수화된 함수는 데이터 조작도 할수없을뿐더러 기회조차 제공하지 않는다고 했다 함수안에서 데이터조작을 이뤄지지않지만 ShowData()함수를 호출하고 있다. 만약 ShowData()함수가 상수화 되어있지 않으면  에러가 발생한다 ShowData()함수에서 데이터조작을 할수도 있기 때문이다. 이럴때는 ShowData()함수에도 const를 붙여줘야한다.

[ const 객체 ]
- 데이터의 변경이 허용되지 않는 객체
- const 함수 이외에는 호출불가
객체 생성은 이런식으로 const Student kyoe(24,100); 선언해 주면 된다.

[ 함수오버로딩 ]
- const도 함수 오버로딩 조건에 포함된다.
void Student() const{}
void Student() {}
위와 같이 함수가 오버로딩 되어있다
const Student kyoe1();
student kyoe2();
객체생성시 상수화된 kyoe1객체는 상수화된 Student() 생성자를 호출하게 된다 상수화되지 않은 kyoe2는 당연히 상수화 되지않은 Student()를 호출한다.