誰が為にconst
その1

2002/02/03 undo


いやぁ、1か月ぶりですねぇ〜(^^;
もうバッチリ準備して待っていたでしょうか? それとも、諦めちゃったでしょうか? こういうのって毎週更新しても仕方ないと思うので、少し間をあけながら追加しているんですけど、今のところ、全く反響がないので(^^;)、ボチボチはじめています。そろそろプログラミングを習う準備はできたころだと思うし、すでになんか書いてみたとも思うのですが、どうでしょうか?

プログラミング言語の選択に困るでしょうか? 実用的なプログラムを書こうとしたら、現在では、おそらくC++, Javaあたりは避けて通れないでしょう。Javaはプログラムを書くためにはまだ少し早いと思いますが、本を読んで知識を得るためには最低限の知識が必要となるでしょう。なにかの本で知識を得るとき、BASICやスクリプト言語しか知らないと、C++あたりの言語はとても難しく感じるものです。シンタックスはそれほど難しいものでもないので、概念が理解できたら使えばいいし、使いながら理解していけばいいと思います。私だって何でもかんでも知っているわけではないですが、実用的なプログラムは書けます。

それで、本日はC/C++で最初につまづくであろう「const」をとりあげます。


「const」とは、おそらくconstantの略で、fixedとかnot changingとかの意味になると思います。つまり「書き換えません」とか「書き換えてはいけません」という意味ですね。たとえば、

const int i;

とは、「iという名前で、書き換えない整数型の変数」という意味ですね。
と、まぁこのくらいは本を読めば、すぐに理解できるでしょう\(^O^)/


それでは、次の例はどうでしょうか?

void func1(const int arg1);

「arg1という名前で、書き換えない整数型のvoid func1()の引数」という意味ですね。

Q1: これは誰が書き換えないのでしょうか?

A1: func1()がarg1を書き換えないのです。

Q2: では、何のため、誰のためにわざわざ書き換えないと宣言しているのでしょうか?


A2の前に、次の例はどうでしょうか?

void func2(const int * arg2);

Q3: これは何の、誰のためのconst宣言でしょうか?

A3: arg2が指し示す先の整数型データを書き換えないと宣言しています。これはfunc2()実行中に*arg2が変更されないことを保証しています。func2()の呼び出し後に*arg2が変更されないことになりますので、func2()の呼び出し元で*arg2を待避したり、コピーしたりする必要がないことを意味します。
このconstがなかったら、*arg2はいつ書き換わるか分からないことになります。つまり、呼び出し元のために宣言しているわけです。呼び出し元にとっては、func2()の中で何をしているか分からないけど、少なくとも*arg2は変更しないということは分かるわけです。


それでは、A2に戻りましょう。

A2: func1()の引数arg1を書き換えないと宣言しています。これはfunc1()自身のために宣言しているのです。
たとえば、constがなかったら、どうでしょうか? arg1の場合、呼び出し元にとっては、constがあろうとなかろうと、どちらでもいっしょなのです。arg1は仮引数であり、func1()を呼び出すときにコピーされた値であるためです。つまり、少なくとも呼び出し元のために宣言しているわけではないということです。


arg1とarg2のconstの違いが分からないと、constはいつまで経っても分からないでしょう\(^O^)/

簡単でしたか? それでは、次のconstは誰のために何が変更されないのか考えてみましょう。

void func3(int * const arg3);

今日の専門用語


戻る