static
VB 使いが C++ で違和感を感じるもののひとつが static かも知れないな。たとえば関数スコープの変数を、static/Staticで加算していくこんなクラス
' VB ' CIncriment Option Explicit Public Function Incriment() As Long Static slngNumber As Long slngNumber = slngNumber + 1 Incriment = slngNumber End Function
// C++ // CIncriment class CIncriment { public: int Incriment () { static int siNumber = 0; return ++siNumber; } };
これで、だいたい一緒かな?これを、インスタンスを作成しては、Incriment メソッドをコールしてみる。
まず VB 。フォームモジュールにコマンドボタンを一個。
Option Explicit
Private Sub Command1_Click()
Dim oObject As CIncriment
Set oObject = New CIncriment
Call MsgBox(Format$(oObject.Incriment(), """Return ""0"))
End Sub
ボタンをクリックするたびに、表示されるのは"Return 1"。クリックするたびにインスタンスが作成されて、インスタンスを作成する都度 slngNumber は初期化されるからだ。
次は C++ 。q以外のキーをクリックすると、結果を表示する。
#include <conio.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
while ( 'q' != _getch() )
{
CIncriment inc;
cout << inc.Incriment() << endl;
}
return 0;
}
・・・ほんとにインクリメントされている!最初はこれが納得いかなかった。C++はインスタンスごとにメソッドメンバが存在するわけではないので、static変数は一つしかないのだ。気付くのに時間がかかった。staticの意味が違うってことかな。
トラックバック
- このエントリーにトラックバック:
- http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/355
コメント