カワサキの技術ブログ

エンジニア志望によるゆるゆる備忘録。

【C++】用語解説:constメンバ関数【初心者】

はじめに

C++にはconstメンバ関数というものが存在します。これはJavaには存在しないものであるため、非常に分かりづらいと感じました。 そこで今回は、constメンバ関数がどういうものなのか、どうしてconstメンバ関数の使用が推奨されるのかを明らかにしていきます。

目次

用語の確認(メンバ、データメンバ、メンバ関数

まずはじめに、constメンバ関数を理解するにあたって必要な用語の意味を確認します。
なお、各用語の解説には『新・明解C++入門』を参考にしています。


メンバ

クラスを構成する要素全体をメンバといいます。
メンバは、その態様から
データメンバメンバ関数に分けられます。
実際のソースコードで確認すると、以下のような構成になります。

#include <iostream>

class User {
//--- メンバ ---//
    
private:
    //--- データメンバ ---//
    std::string name_;
    int age_;
    
public:
    //--- メンバ関数 ---//
    
    //--- コンストラクタ ---//
    User(std::string name, int age) : name_(name), age_(age){}
    
    //--- ゲッタ ---//
    std::string name() const { return name_; }
    int age() const { return age_; }
    
};
データメンバ

データメンバはクラスが保持している情報(変数)です。
Javaでいうところのフィールドにあたります。
先のソースコードでは、string型の変数name_int型の変数age_がデータメンバにあたります。

メンバ関数

メンバ関数とは、クラスの内部に存在する関数のことをいいます。
非公開のメンバにアクセスすることができます(ゲッタやセッタなど)。

constメンバ関数とは

これまでクラスを構成する用語を解説してきましたが、いよいよ本題に入ります。 constメンバ関数とは一体どういうものなのでしょうか。
前述したソースコードだと、以下の部分がconstメンバ関数にあたります。

//--- ゲッタ ---//
    std::string name() const { return name_; }
    int age() const { return age_; }


constメンバ関数は、通常の関数名(仮引数)の後にconstを記述することで実現できます。 constをつけることで、当該関数がオブジェクトの値を変更しないと宣言することができます。
しかし、どうしてわざわざconstをつける必要があるのでしょうか。

constなオブジェクト

クラスからオブジェクトを生成する際ににconstをつけると、いったん設定された値を変更できないオブジェクトが生成されます。

const int hoge = 10;int型の定数hogeを宣言するのと同じ要領で

const User kawasaki("kawasaki", 20);

と宣言することでオブジェクトkawasakiは、その値が変更されるのを回避するためメンバ関数を呼び出せなくなります。


しかし、メンバ関数の中にはデータメンバを変更しないものもあり、constなオブジェクトがそういった関数を利用することに問題はないはずです。 そこで、constなオブジェクトが任意のメンバ関数を使用できるようしたものがconstメンバ関数なのです。 データの値を変更しないメンバ関数にconstをつけることで、constなオブジェクトでもその関数を呼び出せるようにしています。

まとめ

  • データメンバといった値を変更できないconstなオブジェクトは、メンバ関数の呼び出しができない。
  • constなオブジェクトにメンバ関数の呼び出しを許可したものがconstメンバ関数である。
  • オブジェクトの値を変更しないゲッタなどにはconstをつけて定義するべきである。

参考文献