constメンバ関数


オブジェクトの変更拒否

あらかじめ、オブジェクトがもつメンバ変数の値を変更する予定のない
データの読み込み専用の関数などは、メンバ変数を変更できないようにすると
思わぬ変更によるデータの整合性の損傷を避けることができます

メンバ関数の宣言に const キーワードを指定すると
そのメンバ関数はオブジェクトの持つメンバ変数を変更できなくなります

member-function() const {...

メンバ関数名の後に const を指定するところに注意してください
#include<iostream>
using std::cout;

class Kitty {
public:
	char *str;
	void print() const {
		//str = "Chobits";
		cout << str;
	}
	Kitty(char *str) { this->str = str; }
};

int main() {
	Kitty obj("Kitty on your lap\n");
	obj.print();
	return 0;
}
コメント部分をコンパイルすると、エラーになります
メンバ変数 str は、print() メンバ関数から変更することはできません
しかし、読み込むことは問題ないので cout << str に問題はありません

ただし、const メンバ関数が変更できないのはオブジェクトのメンバ変数だけです
静的メンバ変数やその他の変数は変更することができます

const オブジェクトは 非const メンバ関数を呼び出すことはできません
しかし、const メンバ関数は const オブジェクトから安全に呼び出すことができます
#include<iostream>
using std::cout;

class Kitty {
public:
	void print() const {
		cout << "Kitty on your lap";
	}
};

int main() {
	const Kitty obj;
	obj.print();

	return 0;
}
開発するシステムの内部仕様に基いて、上手に利用しましょう


constメンバ関数からの代入

「いたちごっこ」のようですが、const メンバ関数から
データの書き込みができるメンバ変数を作成することもできます

constメンバ関数は、内部でオブジェクトの持つ値を変更できません
しかし、メンバ変数が変更を許可している場合は変更することができます
メンバ変数が const 関数からの変更を許可するには mutable キーワードで明示します

mutable member-variable-declaration;

member-variable-declaration は、メンバ変数を指定します
このキーワードを付加したメンバ変数をクラスで宣言した場合
このメンバ変数は、const メンバ関数からのないようの変更を許可します
#include<iostream>
using std::cout;

class Kitty {
public:
	mutable char *str;
	void print() const {
		str = "Chobits";
		cout << str;
	}
	Kitty(char *str) { this->str = str; }
};

int main() {
	Kitty obj("Kitty on your lap\n");
	obj.print();
	return 0;
}
以前のプログラムの一部を変更したものです
メンバ変数 str に mutable を指定しているのがわかりますね
const 指定のメンバ関数 print() からメンバ変数 str に代入文があります

通常はオブジェクトの値を変更できない const メンバ関数ですが
この場合は mutable を指定しているので完全に有効です
このプログラムは、正常にコンパイルすることができます

ただし、mutable は非静的かつ非定数データ メンバ であるのが条件です
static や const が指定してあるメンバ変数に mutable を適応させることはできません


member-function const

オブジェクトのメンバ変数を変更することができない
メンバ関数であることを宣言します
この関数からは、オブジェクトは変更されません

mutable member-variable-declaration;

クラスの非静的、非定数のメンバ変数にのみ指定できます
mutable 宣言をすると、const メンバ関数から
このメンバ変数に対してデータの変更を行うことができます



前のページへ戻る次のページへ