const とは?
変数に const を付けて宣言することで、定数になります。
すると、初期化以外では値の代入ができなくなります。
これはCでもC++でも共通です。
:
const int number1 = 10; //定数number1を宣言、初期値は10
:
number1 = 3; //number1に値を代入しようとすると
: //コンパイルエラーです(^_^;)
#defineの代わりに使用出来ます
C++の const は、Cのconstに比べて機能が拡張されており、Cの#defineで
数値を定義するような場面で、代わりに使うことができます。
Cでは、配列のサイズを定義するときに#defineを使っていました。
:
#define BUFFSIZE 10
int main(void)
{
int Array[BUFFSIZE]; //コンパイル前にBUFFSIZEは10に置き換わります
:
同様のことをC++ではconstで実現出来ます。
:
int main(void)
{
const int BUFFSIZE = 10; //定数BUFFSIZEを宣言、初期値は10
int Array[BUFFSIZE]; //Arrayのサイズはモチロン10です
:
ちなみに、これはCではコンパイルエラーになります(^_^;)
constのメリット
#defineを使うような場面でも、constを使うことをオススメします。
- constなら型が指定できるので、コード記述時のミスを予防できる
- デバッグ時に#defineの値を表示できないことがある
また、関数の引数を定数にすることもできます。
関数の宣言で引数にconstをつけると、引数の値を間違えて変更してしまうのを
防ぐことができます。例えば次のプログラムはコンパイルエラーになります。
void DisplayNumber(const int number) //引数numberを定数にします
{
number = 3; //コンパイルエラーで、実行出来ません(^_^;)
}
ポインタにconstを指定したときは、その指し示す先の値が定数になります。
次の例を見てください。
#include <stdio.h>
#include <string.h>
void DisplayString(const char *pstr) //ポインタpstrの指す先の値はconst
{
strcpy(pstr, "this is a cat."); //pstrに文字列をコピーしようとすると
} //コンパイルエラーになります(^_^;)
int main(void)
{
char *buff = "this is a dog."
DisplayString(buff);
return 0;
}
C言語では警告は出るものの、実行できてしまいました(;´∀`)
関数の中で値を変更しない場合は、引数をconstにしておくことがオススメです。
constにしておけば、間違えて引数の値を変更してしまうことを防げます。
const指定したポインタ使用時の注意点
const指定をしたchar型のポインタpstrを通常のポインタに代入しようとすると
どうなるかをみていきましょう。
:
void ChangeStr(const char *pstr)
{
char *buff; //char型のポインタ変数です
buff = pstr; //const指定したポインタ変数pstrを
} //ポインタ変数buffに代入しようとすると
: //コンパイルエラーになりますです(^_^;)
const指定したポインタを、const指定していないポインタに代入しようとすると
コンパイルでエラーになってしまします。
なぜなら、もし代入できてしまうと、次のようにconst指定したポインタの内容が
書き換えられてしまうからです。
:
void ChangeStr(const char *pstr)
{
char *buff;
buff = pstr;
buff[0] = 'a'; //もしbuff[0]を'a'にできるとするとpstr[0]も
} //'a'になってしまします!!
:
C++では、当然コンパイルエラーになります。
buffポインタを使用してconst宣言した筈の pstr の内容を書き換えられてしまっては
大問題ですね(^_^;)
そのため、「const指定したポインタを通常のポインタに代入できない」という
お約束があるのです。
constをうまくつかってミスのないプログラムを作成したいものですね^^
今日の名言
人に望まれ賞賛される勇気は、美しく死ぬ勇気ではなく、男らしく生きる勇気である。
トーマス・カーライル
苦しみを恐れるものは、その恐怖だけですでに苦しんでいる。
ミシェル・エケム・ド・モンテーニュ
行動は必ずしも幸福をもたらさないかもしれないが、行動のないところに幸福は生まれない。
ベンジャミン・ディズレーリ