2013年8月24日土曜日

C++ スコープ解決演算子とは?

スコープとは変数や関数の有効範囲のことを指しています。
もし、この有効範囲内に同名の変数や関数がある場合は、スコープ解決演算子を
使います。^^

ローカル変数とグローバル変数の名前が同じとき、関数内ではローカル変数が
優先されます。これはなんとなくイメージできるのではないでしょうか?
しかし、スコープ解決演算子を使うことで、グローバル変数を優先させることが
できるようになります。

例えばこんな風に使われます。
//:: がスコープ解決演算子です。
::myname;  //グローバル変数の myname にアクセスします

そして、スコープ解決演算子の前にクラス名をつけると、オブジェクト内のメンバ変数を
使うということが明示できます。

//Personクラスのオブジェクトにあるメンバ変数のmynameにアクセスします。^^
Person::myname;


スコープ解決演算子を使ったサンプルプログラム
#include <iostream>
#include <string.h>

using namespace std;

char myname[] = "グローバル時代を席巻するジェイムズ";

class Person{
public:
    Person();
private:
    char myname[64];
};

Person::Person()
{
    char myname[] = "ローカルエリアネットワークにいるジェイムズ";
    strncpy(Person::myname, "パーソンクラスにいるジェイムズ",
                sizeof("パーソンクラスにいるジェイムズ"));

    //ローカル変数
    cout << "My name is " << myname << endl;
    //メンバ変数
    cout << "My name is " << Person::myname << endl;
    //グローバル変数
    cout << "My name is " << ::myname << endl;
}

int main(void)
{
    Person myPerson;

    return 0;
}

実行結果
# ./test
My name is ローカルエリアネットワークにいるジェイムズ
My name is パーソンクラスにいるジェイムズ
My name is グローバル時代を席巻するジェイムズ

何故ジェイムズだったのかというと、今日の名言に登場するからです(^_^;)
また、スコープ解決演算子は、関数やオブジェクトへアクセスする時にも
同じように使います。
とても便利ですね、スコープ解決演算子(^^)


//グローバル関数(メンバ関数以外)のGetPersonAge()関数にアクセスします。
::GetPersonAge();


今日の名言
年をとれば額にしわがよるのは仕方がないが、心にまでしわを作ってはならない。
                                 ジェイムズ・A・ガーフィールド

人生において重要なことは、大きな目標を持つとともに、それを達成できる
能力と体力を持つことである。
                             ヨハン・ウォルフガング・フォン・ゲーテ
                
自分のことで卑屈になったり、引っ込み思案になったりしがちなのを克服する
最上の方法は、他人に興味を持ち、他人のことを考えることだ。気後れなど
うその様に消え去ってしまう。他人のために何か尽くしてやることだ。常に人に
親切を尽くし、友人のような心で接すれば、あなたはそのすばらしい結果に
驚くことだろう。
                                 デール・カーネギー

熱中する心がなければ、この世に進歩はありえない。
                                 ウッドロー・ウィルソン