メンバ関数のstaticについて

解決


ぴょぴょ  2008-05-06 05:41:04  No: 68250  IP: 192.*.*.*

お世話になります。

次のリンクのPath.hppファイルを見て疑問を感じました。
http://aibm4.main.eng.hokudai.ac.jp/~takty/pro/path/

このファイルにはメンバ関数にstaticをつけています。
staticを付けると1つしか定義できないと僕は認識しています。
でもstaticをほぼ全てのメンバ関数につける意味はあるのですか?
ない場合とある場合で何か得でもしますか?メモリ効率など。

教えて下さい。

編集 削除
tetrapod  2008-05-06 07:35:59  No: 68251  IP: 192.*.*.*

まず static って何ぞやって理解は大丈夫なのだろうか。
> staticを付けると1つしか定義できないと僕は認識しています。
それは結果論であって本質ではないと思うぞ。 class hoge があるとして
static メンバー=およそ hoge であるものすべてに共通な何か
非 static メンバー=特定の hoge インスタンス1つについての何か
「本質的に共通」であるがゆえに1つしか必要ない、っつーことで

技術的な解説をするなら
static メンバー関数は C の頃の関数「非メンバー関数」と同等
非 static メンバー関数は「this を暗黙の引数として取る関数」
というわけで static メンバー関数のほうが1つ引数が少ないわけだ
その分 static メンバー関数は呼び出しコストも低い

提示サンプルは static にする代わりに string& 引数がひとつ増えている
これは言ってみれば暗黙の this に相当するわけで、結局のところ
非 static メンバー関数を自前で明示的に作っているだけだ。
この例での呼び出しコストは、引数がひとつ増えたため同一だ

ただし string& 引数を明示的に渡せるようにしておけば、
そこには this 以外も渡せる、という意図があるわけだ。
shortcutPath と shortcutPathDest と2つあるけど、こいつらは
this を直接使う場合と this 以外を使う場合と、2つ使い分けしてる。
使い分けをしないでよい関数はきっちり non-static になっているよ。

俺なら string を派生したクラスは作らないけど

編集 削除
ぴょぴょ  2008-05-07 09:28:04  No: 68252  IP: 192.*.*.*

tetrapodさん。
こちらでもありがとうございます。

何回か読んでみましたが使い分けに関しては
ちょっとまだ理解できないようです。(泣)

でもstaticメンバー関数はthisを引数として
取らないとは今回始めて知りました。

もう一度リンクのサンプルを見ながらゆっくりと
考えて見ます。一通り解決マークは付けて閉じます。
ありがとうございました。

編集 削除
tetrapod  2008-05-07 10:26:43  No: 68253  IP: 192.*.*.*

static と non-static の違いについては、手前味噌だけど参考になるかな
http://m--takahashi.com/bbs/pastlog/13700/13681.html

# Java の Double クラスとか知ってる? (double ではなく Double)
# およそ Double であれば共通の MAX_VALUE や MIN_VALUE がある = static
# 各インスタンスそれぞれが固有の doubleValue() を持っている = non-static
# とか、そういうことなわけだ

このサンプルは static を多用しすぎていてあまりよくない気がする
this に縛られない作業関数を static にしている、って設計だな。
クラスの本質的なところがわかっている人が使うには適切だけど
そうでない初心者にとっては混乱の元になりかねないだろう。

編集 削除