お世話になります。
次のリンクのPath.hppファイルを見て疑問を感じました。
http://aibm4.main.eng.hokudai.ac.jp/~takty/pro/path/
このファイルにはメンバ関数にstaticをつけています。
staticを付けると1つしか定義できないと僕は認識しています。
でもstaticをほぼ全てのメンバ関数につける意味はあるのですか?
ない場合とある場合で何か得でもしますか?メモリ効率など。
教えて下さい。
まず 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 を派生したクラスは作らないけど
tetrapodさん。
こちらでもありがとうございます。
何回か読んでみましたが使い分けに関しては
ちょっとまだ理解できないようです。(泣)
でもstaticメンバー関数はthisを引数として
取らないとは今回始めて知りました。
もう一度リンクのサンプルを見ながらゆっくりと
考えて見ます。一通り解決マークは付けて閉じます。
ありがとうございました。
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 にしている、って設計だな。
クラスの本質的なところがわかっている人が使うには適切だけど
そうでない初心者にとっては混乱の元になりかねないだろう。