2013年8月11日日曜日

C++定数の宣言

出ました、定数を宣言するには const を使用します。

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をうまくつかってミスのないプログラムを作成したいものですね^^



今日の名言
人に望まれ賞賛される勇気は、美しく死ぬ勇気ではなく、男らしく生きる勇気である。
                                     トーマス・カーライル

苦しみを恐れるものは、その恐怖だけですでに苦しんでいる。
                                 ミシェル・エケム・ド・モンテーニュ

行動は必ずしも幸福をもたらさないかもしれないが、行動のないところに幸福は生まれない。
                                     ベンジャミン・ディズレーリ