ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
C/C++の予約語の一つで、いくつかの意味を持ち、主に変数に使う場合とクラスのメンバー関数に使う場合とがある。
当初のCにはなく、ANSI Cから追加された。C++には最初からある。
C/C++では「上書き不可」とし、その変数を読み込み専用の定数として扱えるようにする機能を提供する。
ただし、ポインター型に対してconstを使うと、使い方によって挙動が変化するので注意が必要である。
変数の型定義に使うconstの書き方には、二種類の使い方から三通りの組み合わせがある。
以下、順に説明する。
一般的に使われるのが、このhoge(const char *src)という書き方である。
なお、hoge(char const *src)と書いても同じ意味である。
この時、読み出し専用になるのはsrcではなく、srcが指し示す先にあるもの、である。従って、この関数内でsrcに代入してもエラーにならないが、*src=0;などとすればエラーになる。
一方、srcそのものを読み出し専用にするにはhoge(char * const src)と書くことになる。
srcに代入すればエラーになるが、srcが指し示す先にあるものは保護されない。
Cでは、定数の定義に#defineが使われた。C++でも使われるが、C++ではそれより、constを使う方が良い。
#define BUFSIZE 1000
#defineの場合「型」が定かでない。C++は型にうるさい言語であるため、定数であっても型を持つことが望ましい。
const size_t BUFSIZE=1000;
constで定義したBUFSIZEは、#defineで定義したBUFSIZEとは違って変数である。
変数に使うconstの書き方には、三種類の使い方がある。
参照に限らず、constの値も返すことができる。そうすると、以下のような利点が考えられる。
class Hoge {
public:
...
// 敢えてconstの値を返す
const Hoge operator+(const Hoge &rhs) const { return ...; }
};
ここで次のような(誤った)使い方をするとエラーとなる。
Hoge a, b, c;
...
if (a + b = c) {
...
}
本来は「a + b == c」のつもりだったが、誤って=と書いてしまった例である。しかし、constのおかげでコンパイルエラーとなり、バグの混入を避けることができた。
バグの混入を減らすために、積極的にconstを付けるべきである。スコット・メイヤーズ(著)小林 健一郎(訳)のC++基本書「Effective C++ 原著第3版」にも「第3項 可能ならいつでもconstを使おう」という記述がある。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます