클래스를 정의할 때 멤버 필드 앞에 const를 붙여서 선언한 것을 상수화 멤버라고 말합니다. 비 정적 상수화 멤버 필드는 생성자에서 반드시 초기화 기법으로 상수 값을 설정해야 합니다. 그리고 정적 상수화 멤버 필드는 클래스 외부 선언에서 초기값을 지정해야 합니다.
class Student { const int num; //비 정적 상수화 멤버 필드 string name; int hp; static const int max_hp; //정적 상수화 멤버 필드 public: Student(int _num,string _name); }; const int Student::max_hp=200; //정적 상수화 멤버 필드 초기값 지정 Student::Student(int _num,string _name):num(_num)//비 정적 상수화 멤버 필드 초기화 { name = _name; }
예를 들어 학생 생성 시에 학번을 부여하고 이후에는 학번을 변경하지 못하게 상수 멤버 필드로 사용할 수 있습니다. 또 다른 예로 학생의 iq가 최대 200까지만 올라갈 수 있게 하려고 한다면 static 상수 멤버 필드로 정할 수 있습니다.
그리고 비 정적 멤버 메서드 선언 뒤에 const 키워드를 붙인 것을 상수화 멤버 메서드라 부릅니다. 상수화 멤버 메서드는 비 정적 멤버 메서드에만 사용할 수 있으며 메서드 내부에서는 개체의 상태를 바꿀 수 없습니다. 따라서 상수화 멤버 메서드에서는 멤버 필드 값을 변경할 수 없습니다. 주의할 점은 상수화 멤버 메서드는 클래스 외부 함수 정의문에도 반드시 const 키워드를 붙여야 합니다.
//Student.h #pragma once #include <iostream> #include <string> using namespace std; class Student { const int num; //비 정적 상수화 멤버 필드 string name; int hp; static const int max_hp; //정적 상수화 멤버 필드 public: Student(int _num,string _name); void View()const;//상수화 멤버 메서드 };
//Student.cpp #include "Student.h" const int Student::max_hp=200; //정적 상수화 멤버 필드 초기값 지정 Student::Student(int _num,string _name):num(_num)//비 정적 상수화 멤버 필드 초기화 { name = _name; hp = 0; } void Student::View()const//상수화 멤버 메서드 { cout<<"번호:"<<num<<" 이름:"<<name<<" HP:"<<hp<<endl; }
//Program.cpp #include "Student.h" int main() { Student *stu = new Student(3,"홍길동"); stu->View(); delete stu; return 0; }
▷ 실행 결과
번호:3 이름:홍길동 HP:0