[디딤돌 C++] 18. 상수화 멤버

클래스를 정의할 때 멤버 필드 앞에 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