[Step. 15] static 생성자, initonly, literal
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