月曜日, 1月 28, 2008

C++解説7(参照)

1.1 参照とは
ポインタについては理解できたと思います。
しかしC++ではポインタより便利な概念の参照というものが導入されました。
これは非常に有効な機能であるため覚えておくと大変いいでしょう。
参照とは関数側で関数呼び出し元で引数に与えている変数のアドレスを参照する事を宣言します。
まあ、言葉で聞くより1回プログラムを書いてしまうのが
これについては一番いいと思いますので、簡単なswap関数を記述します。

#include "stdio.h"

void c_swap( int *x, int *y ) {
int z;
z = *x;
*x = *y;
*y = z;
}

void cpp_swap( int &x, int &y ) {
int z;
z = x;
x = y;
y = z;
}


int main(void) {
int a, b;
a = 1; b = 2;

printf("a = %d, b = %d\n", a, b );
c_swap( &a, &b );
printf("a = %d, b = %d\n", a, b );
cpp_swap( a, b );
printf("a = %d, b = %d\n", a, b );

return 0;
}

実行結果
a = 1, b = 2 // 代入した値
a = 2, b = 1 // c_swap後
a = 1, b = 2 // cpp_swap後


内容は簡単に理解できると思いますので、参照の文法についてから触れます。
参照とは変数宣言に&を使用します。
ポインタは*に対して、参照は&と記述するだけなので
そんなにここについては抵抗がないと思います。
参照された引数については、実際のアドレスを参照する事になります。
そのため、値を変更すると参照先のアドレスである実際に
引数として設定した値が変更される事になるのです。
また、参照で指定した引数は通常に宣言したものとして同じように使用できるため
「->」(アロー演算子)など必要とせず「.」という演算子でアクセスできます。
これは効率の面からも可読性の面からも大変すぐれた仕組みだと言ってよいでしょう。

関数呼び出しとは一般的にオーバーロードが発生します。
C言語で変更する必要がないためアドレスは渡さないと言った手法が存在します。
その場合、引数すべての値のコピーが発生します。
しかし、アドレス渡しとは参照するためのアドレスを格納する箱4Byte固定となります。
今ではC言語もconst付きで引数をアドレス渡しを行えば、
この事象は防ぐ事はできますが
それでも参照の可読性の高さには到底及びません。

1.2. ポインタから参照へ

ここまで説明してきたように参照とはどこかの変数に成り変る事です。
上では関数の引数について参照を扱ってきましたが、
もちろん通常に参照変数を宣言する事も可能です。

int i = 1;
int &r = i;

こんな感じですね。もちろん「r」を出力すれば「1」が出力される事になります。
この何がいいのかというのがと言う事について考えてみます。

まず何と言っても可読性が違います。
よくプログラムを分かり易くするためにコメントを書くと言った事が言われます。
これについて勿論異論がある訳ではありません。
しかしコメントを書いてプログラムが分かり易くなるでしょうか?
ここはずばり「ノー」と言うしかありません。
コメントを入れて分かり易くなるのは、そこでのコードが何を行おうとしているのかであって
プログラム事態は分かり易くはなりません。
何を行おうとしているのか分かる事によってプログラムを読む手助けになると言う訳です。
プログラムを分かり易く書くというのとは、まったく別次元の話だと思います。
それにこの事を理解しないで以下のようなコメントを見た事があります。

// メモリーを確保する
p = (char*)malloc( 10 );

ふざけてるとしか思えません
これにコメントが必要ですか?
プログラムのコメントを書くという事と解説を書くという事が同じ事になっています。
プログラムを教材として使用する場合にその解説に記述するのであれば
多少は許せますが、自分で書くプログラム、職業として書くプログラムには不必要なコメントです。
少し脱線し過ぎました。

要するに、可読性が高いというのは
人間の目に主観的に捉えやすいという事だと思います。
C++がC言語より可読性が高いのはもちろん参照が全てを決める訳ではありません。
参照なんて、どちらかと言うと大して効果が出ない方の部類でしょう。
それでも、プログラムから「*」や「&」が圧倒的に少なくなる
プログラムを一度見てしまうと全然違います。

参照はめちゃくちゃ意識して書いて下さい。
いつか、それがスタンダードとなって自然に書くようになります。

0 件のコメント: