constメンバ関数
読み取り専用メソッドを示します
「constメンバ関数」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
const メンバー関数とは
const を付けたメンバー関数は、オブジェクトから見える状態を変更しないことを保証します。このキーワードはパラメーターリストの後ろに置きます。
#include <iostream>
class Counter {
int n = 0;
public:
int value() const { return n; } // read-only
void inc() { ++n; }
};
int main() {
Counter c;
c.inc();
std::cout << c.value() << "\n";
}const オブジェクトは const メソッドを呼び出す
const オブジェクトに対しては、const メンバー関数だけを呼び出せます。非 const メソッドは禁止されています。
#include <iostream>
class Counter {
int n = 0;
public:
int value() const { return n; }
void inc() { ++n; }
};
int main() {
const Counter c;
std::cout << c.value() << "\n"; // OK
// c.inc(); // ERROR
}this は const になる
const メンバー関数の内部では、this は const へのポインターになります。そのため、メンバーを変更しようとするとコンパイラーに拒否されます。
読み取り専用メソッドにはすべて const を付ける
ゲッター、問い合わせ用メソッド、出力用メソッドにはすべて const を付けるべきです。これにより、const オブジェクトや const 参照に対しても使えるようになります。
const のオーバーロード
メソッドには const 版と非 const 版の両方を用意できます。コンパイラーは、オブジェクトが const かどうかに応じて適切な版を選びます。
#include <iostream>
#include <vector>
class Box {
std::vector<int> v{1, 2, 3};
public:
int& at(int i) { return v[i]; } // mutable access
const int& at(int i) const { return v[i]; } // read-only access
};
int main() {
Box b;
b.at(0) = 99;
std::cout << b.at(0) << "\n";
}mutable キーワード
mutable メンバーは const メソッドの内部でも変更できます。論理的な状態には含まれないキャッシュやカウンターに便利です。
#include <iostream>
class Cache {
mutable int hits = 0;
int data = 42;
public:
int get() const { ++hits; return data; } // hits is mutable
int hitCount() const { return hits; }
};
int main() {
Cache c;
c.get(); c.get();
std::cout << c.hitCount() << "\n";
}論理的な const と物理的な const
const はオブジェクトの論理的な状態を保護します。一方、mutable を使うと、キャッシュのような実装上の詳細をこの保証を破らずに変更できます。
const メソッドと const 参照
const& を受け取る関数は、そのオブジェクトに対して const メソッドしか呼び出せません。問い合わせ用メソッドに const を付けるべきもう一つの理由です。
#include <iostream>
class Counter {
int n = 5;
public:
int value() const { return n; }
};
void report(const Counter& c) {
std::cout << c.value() << "\n"; // needs value() to be const
}
int main() { Counter c; report(c); }const 参照を返す
const アクセサーは、変更やコピーを許可せずにメンバーを公開するため、const& を返すことがよくあります。
const を取り除くキャストは避ける
const_cast を使って本当に const なオブジェクトを変更すると、未定義動作になります。正当な例外には、代わりに mutable を使ってください。
const 正当なクラス
適切に設計されたクラスでは、変更を行わないすべてのメソッドに const を付けます。そのため、プログラム全体の const コンテキストでシームレスに使えます。
確認テスト
const メンバー関数についての理解度を確認します。
まとめ
読み取り専用メソッドに const を付ける方法、const オブジェクトは const メソッドだけを呼び出すこと、const によるオーバーロード、そして mutable によって実装上の詳細を変更できることを学びました。const_cast は避け、最初から const 正当なクラスを設計してください。
よくある質問
「constメンバ関数」レッスンは無料ですか?
はい。「constメンバ関数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「constメンバ関数」で何を学びますか?
読み取り専用メソッドを示します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「constメンバ関数」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。