2011. 3. 7. 21:06
학번같은 변하지 않는 상수 정보를 안정적으로 프로그래밍 하려면
const int id; //학번
의 방식으로 const키워드를 쓰는 것이 좋다.
하지만 다음과 같이 프로그래밍을 할 경우, 컴파일에서 오류가 발생하게 된다.

 #include <iostream>
using std::cout;
using std::cin;
using std::endl;

class Student
{
 const int id; //학번
 int age;//나이
 char name[20]; //이름
 char major[30]; //학과
public:
 
Student(int _id, int _age, char* _name, char* _major)
 {
  id=_id;
  age=_age;
  strcpy(name,_name);
  strcpy(major,_major);
 }
 void ShowData()
 {
  cout<<"이름: "<<name<<endl;
  cout<<"나이: "<<age<<endl;
  cout<<"학번: "<<age<<endl;
  cout<<"학과: "<<age<<endl;
 }
};
int main()
{
 Student Kim(20051577, 20, "Kim Gil Jung", "Computer Science");
 Student Hong(20091122,20,"Hong mi wyoun", "Architecture");

 Kim.ShowData();
 cout<<endl;
 Hog.ShowData();

}


오류를 살펴보자.
우리가 객체를 생성할 때 객체의 생성순서중 첫번째 단계는 '메모리 할당'이다.
이때 객체의 멤버 변수를 위한 메모리 공간도 할당되면서, id 값은 쓰레기 값으로 할당될 것이다.
따라서 이미 한번 초기화 되었으므로 생성자를 통한 초기화는 허용되지 않는다. 값의 변경으로 인식하기 때문이다.

이때 해결책!!
"멤버 이니셜라이저(member initializer)"이다.!
이것을 사용하면 const 멤버 변수를 초기화 하는 것이 가능하다.

  Student(....) : id(_id)
  => "멤버 변수 id를 매개 변수 _id로 초기화하라"

 둘 이상의 const 멤버도 ,(콤마) 연산자를 이용해서 구분 지어 초기화가 가능하다.

수정예제는 다음과 같다.

 #include <iostream>
using std::cout;
using std::cin;
using std::endl;

class Student
{
 const int id; //학번
 int age;//나이
 char name[20]; //이름
 char major[30]; //학과
public:
 Student(int _id, int _age, char* _name, char* _major) : id(_id)
 {
  age=_age;
  strcpy(name,_name);
  strcpy(major,_major);
 }
 void ShowData()
 {
  cout<<"이름: "<<name<<endl;
  cout<<"나이: "<<age<<endl;
  cout<<"학번: "<<age<<endl;
  cout<<"학과: "<<age<<endl;
 }
};
int main()
{
 Student Kim(20051577, 20, "Kim Gil Jung", "Computer Science");
 Student Hong(20091122,20,"Hong mi wyoun", "Architecture");

 Kim.ShowData();
 cout<<endl;
 Hong.ShowData();

}



참고: 열혈강의 c++


Posted by Triany