static 생성자
static 생성자는 클래스의 생성자에서 static 멤버를
초기화 하고 싶을 때 사용합니다.
ref
class, value class, interface에서 사용할
수 있습니다.
#include
"stdafx.h"
#include
<iostream>
using
namespace System;
ref class
A {
public:
static int a_;
static A()
{
a_ += 10;
}
};
ref class
B {
public:
static int b_;
static B()
{
// a_ += 10; // error
b_ += 10;
}
};
ref class
C {
public:
static int c_ = 100;
static C()
{
c_ = 10;
}
};
int
main()
{
Console::WriteLine(A::a_);
A::A();
Console::WriteLine(A::a_);
Console::WriteLine(B::b_);
Console::WriteLine(C::c_);
return 0;
}
< 결과 >
static 생성자는 런타임에서 호출하기 때문에 클래스 A의
멤버 a_는 이미 10으로 설정되어 있습니다. 그리고 이미 런타임에서 호출하였기 때문에 명시적으로 A::A()를
호출해도 실제로는 호출되지 않습니다.
클래스
B의 경우 static 생성자에서 비 static 멤버를
호출하면 에러가 발생합니다.
클래스
C의 경우 static 멤버 c_를 선언과 동시에
초기화 했지만 런타임에서 static 생성자를 호출하여 값이 10으로
설정되었습니다.
initonly
initonly로 선언된 멤버는 생성자에서만 값을 설정할 수 있습니다. 그리고 initonly static로 선언된 멤버는 static 생성자에서만 값을 설정할 수 있습니다.
ref class C
{
public:
initonly static int x;
initonly static int y;
initonly int z;
static C()
{
x = 1;
y = 2;
// z = 3; // Error
}
C()
{
// A = 2; // Error
z = 3;
}
void sfunc()
{
// x = 5; // Error
// z = 5; // Error
}
};
int main()
{
System::Console::WriteLine(C::x);
System::Console::WriteLine(C::y);
C c;
System::Console::WriteLine(c.z);
return 0;
}
literal
literal로 선언된 멤버는 선언과 동시에 값을 설정하고 이후 쓰기는 불가능합니다. 오직 읽기만 가능합니다.
using namespace System;
ref class C
{
public:
literal String^ S = "Hello";
literal int I = 100;
};
int main()
{
Console::WriteLine(C::S);
Console::WriteLine(C::I);
return 0;
}
참고
http://cppcli.shacknet.nu/cli:static%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF
http://cppcli.shacknet.nu/cli:initonly
http://cppcli.shacknet.nu/cli:literal
'C++/CLI' 카테고리의 다른 글
[Step. 16] array 클래스에 non-CLI 오브젝트 사용 (0) | 2010.10.27 |
---|---|
[Step. 14] 인터페이스 ( interface ) (1) | 2010.10.01 |
[Step. 13] parameter array (1) | 2010.09.10 |
[Step. 12] for each (1) | 2010.09.03 |
[Step. 11] 열거형( enum ) (2) | 2010.08.27 |