constメンバ関数

http://www.geocities.jp/ky_webid/cpp/language/020.html

constメンバ関数についてです。

メンバ関数をconstにするというのがどういう意味なのか良く分からないですよね。

これは今までのconstとはちょっと違った仕様になります。

まずは書き方を見てみましょう。

#include <iostream>
using namespace std;

class CSample {
public:
    int m_num;
    CSample(int num);
    int GetNum() const;
};

CSample::CSample(int num) {
    m_num = num;
}

int CSample::GetNum() const {
    return m_num;
}

int main () {
    CSample obj(100);
    
    cout << obj.GetNum() << endl;
    
    return 0;
}
$ main
100

GetNum関数の後ろにconstが付いただけで今まで書いてきた内容と何もかわりませんよね。

しかし、GetNum関数を以下のように書き換えるとコンパイルエラーとなります。

int CSample::GetNum() const {
    // メンバ変数m_numに10加算する
    m_num += 10;
    return m_num;
}
$ cl /W4 /EHsc main.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
main.cpp(16) : error C2166: 左辺値は const オブジェクトに指定されています。

m_numはconstで宣言してないにも関わらず、何故かconstのエラーが出てしまいました。

つまり、constメンバ関数とは、その関数内でメンバ変数の値を変更できなくするためのものなのです。

その関数内でメンバ変数の値を変更する予定がないのであればconstメンバ関数にした方が良さげです。うっかり値を変更してしまうといったミスを防ぐことができますし、なにより、コードを読んでいる人にも「この関数はメンバ変数を変更しないことが保証されている」ということを明示的に示せるので有りだと思います。

ただし何でもかんでも付ければ良いというものでもありません。

const は積極的に付けるべきですが、「今のところは書き変えていないだけ」なのか「書き変えてはならない」のかは、よく考える必要があります。先ほど書いたように、const の特性は波及していくため、後から const を外すことは難しくなる可能性があります。

ということなので慎重に選択する必要がありますね。