2013年9月16日月曜日

C++ 関数へ値を渡す方法を考える

関数に値を渡す方法は、「値渡し」、「アドレス渡し」、「参照渡し」という3種類があります。
今回はそれぞれの使いどころを見て行きます。

3つの方法の比較
それでは、 「値渡し」、「アドレス渡し」、「参照渡し」を比べてみます。
            :
struct Person{
    char name[32];
    int age;
};

void PrintPersonReference(Person &psn);  //参照渡し
void PrintPersonPointer(Person *psn);       //アドレス渡し
void PrintPersonValue(Person psn);           //値渡し
            :

int main(void)
{
            :
     PrintPersonReference(person1);        //参照渡しなので&を付けない
     PrintPersonPointer(&person1);          //アドレス渡しなので&を付ける
     PrintPersonValue(person1);              //値渡しなので&を付けない
            :

これを見ていると、一つ問題がある事に気づきます。(^_^;)
 
参照渡しと値渡しは関数の呼び出し方法が全く同じなので
引数の値が変更されるかどうかわからないのです。(ーー;)

この問題を避けるために、関数の中で引数の値を変更するのは
「アドレス渡し」にするというルールにすると良さそうです。^^

このように、状況別に使い分ける事をおススメいたします。
      関数側で引数を変更しない 関数側で引数を変更する
int型など小さいデータを渡す 値渡し アドレス渡し
構造体など大きいデータを渡す constにした参照渡し アドレス渡し


今日の名言
弁護士になろうとしっかり心に決めれば、それだけで目的は半分達成されたも同然である。
きっと成功してみせる、と決心することが、何よりも重要だということを、常に暗記すべきだ。
                                     エイブラハム・リンカーン

一度に一つずつ事を行え。あたかも自分の生死がそれにかかっているかのような気持ちで。
                                     ユージン・グレース

事実を知れ-事実を抱き締めよ。すべてに基本は熱中である。
そして熱中は純真な心から生まれる。
                                     ラルフ・ワルド・エマーソン

 空気から歌は生まれない。自分が何を創造しつつあるか理解し、感じ取らねばならない。
                                     アーヴィング・バーリン