2013年8月13日火曜日

列挙型の話

列挙型(enum 読み方はイナム、イーナムどっちでも^^)は、整数に名前をつけて
プログラムをわかりやすくすることができる機能です。
使い方は次のようになります。

enum Colors {    //赤橙黄緑青藍紫   虹色(^^)v
    Red,
    Orange,
    Yellow,
    Green,
    Blue,
    Indigo,
    Violet
};

C言語とC++言語の列挙型との違いは列挙型変数の宣言方法です。
例えばC言語では次のような書き方でした。

enum Colors PenColor;

しかし、C++言語では、列挙型変数の宣言するときにenumという記述が不要に
なりました。具体的にはこのようになります。

Colors PenColor;

一瞬構造体か?などと思ってしまいますね(^_^;)

列挙型の要素の値は、0, 1, 2, 3, ... と増えていきます。また途中で任意の数を指定すると
その数から順に1ずつ増えていく形になります。

enum Colors {    //通常の虹色(^^)v
    Red,        //0
    Orange,          //1
    Yellow,           //2
    Green,           //3
    Blue,             //4
    Indigo,           //5
    Violet           //6
};

enum Colors {    //少し変わった虹色2(^^)v
    Red,        //0
    Orange = 12,   //12
    Yellow,           //13
    Green,           //14
    Blue = 25,      //25
    Indigo,           //26
    Violet           //27
};


予告
プログラムを作成しながら、時々関数の引数だけ変えたいと思ったことはないでしょうか?
C++ではこんな場合でも便利な機能があります。それは引数にデフォルト値を設定する
方法です。デフォルト値が設定されていれば、値を設定しなくても呼び出すことができます。

今仮に、円の面積を計算する関数があったとして、円周率を指定する引数をデフォルト値で
3.141592を設定したとします。この場合円周率を指定せずに呼び出すとデフォルト値である
3.141592が円の面積計算で使われます。そして、一方、円周率に3を設定した場合は
円周率が3として円の面積を計算します。

このように、ほぼ同じ処理なんだけど引数が少し変わることもある、という場面では
デフォルト引数を設定しておくと便利ですし、コードが読みやすくもなります。

また、引数の型や数が違えば、別の関数に同じ名前をつけることもできます。
これはオーバーロードといいます。紛らわしい単語にオーバーライドというのもあります^^
Cでは同じ「大きい方の数値を返す関数」でもint用、double用などと別名で分けなければ
なりませんでした。しかし、C++では関数は同じ名前にできますので、よりシンプルな
コードを書くことができます。

予告2
Cでは、使用する2つのライブラリに同じ名前の関数や変数がある場合、コンパイル、
リンクでエラーになっていたかと思います。その場合ヘッダファイルの編集で解決出来れば
良いですが、大抵は「衝突を防ぐためライブラリを使用しない」というやむなしの消極的
対応しかできなかったのではないでしょうか(^_^;)

C++では関数名や変数名の重複をあらかじめ防ぐ手段が追加されています。
それには名前空間(namespace)という方法を使います。
名前空間を使用することで、関数や変数の有効範囲を限定できるのです。

例えばRedという名前空間とOrangeという名前空間に、それぞれ同じSetPenColor()という
関数があっても問題ありません。SetPenColor()関数を使うときに、どの名前空間に属する
SetPenColor()関数を使うかだけを意識すればよいのです。

名前空間を使えば他と名前が被ってしまうことを気にしないで済むようになります。
余計なことに頭を悩ませる必要がなくなりますね(^^)

次回以降で名前空間と関係するスコープ解決演算子やプログラム実行時の
入出力オブジェクト、引数付きマクロに似ているインライン関数について
見ていきます。 できることが増え一層楽しくなってくるかと思います(^^)



今日の名言
人間は死を恐れるべきではない。こう言えるのは、私が死に何度も直面したからである。
その体験は全く快いものだ。耳には美しい音楽が聞こえ、全ては甘美で静寂である。
もがき苦しむことも恐怖もない。死に直面すれば、これほど容易でこれほど幸福な経験は
生まれて初めてだ、ということが分かる。
                                      エディー・リッケンバッカー

いくら知恵があっても、これを使う勇気がなければ何の役にも立たないように、いくら
信仰が厚くても、希望がなければ何の価値もない。希望はいつまでも人とともにあって
悪と不幸を克服するからである。
                                      マルティン・ルター

事前にあわてふためいて、あとは悠然と構えているほうが、事前に悠然と構えていて、
事が起こった時にあわてふためくよりも、利口な場合がある。
                                      ウィンストン・チャーチル