< atoin 関数 | Microsoft 単語帳 用ブックマークレット >

April 30, 2004

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

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?