|
Variant class에 operator*()와 operator+()가 있기 때문에 그렇습니다.
Variant는 주로 OLE Automaton에 사용되는 것으로서,
short, int, float, double, Currency, TDateTime, bool, WordBool, Byte, AnsiString&, char *, wchar_t * const, Ole2::IDispatch* const, Ole2::IUnknown* const
타입을 모두 가질 수 있는 데이터 타입입니다.
웬만한 기본 데이터 타입은 전부 가지고 있습니다.
원래 이 타입은 베이직에서 유래한 겁니다. 비베 사용자라면 친숙할 겁니다.
원래 인터프리터 언어인 베이직은 선언하지 않고 변수를 쓸 수 있는 데,
이 때의 타입이 Variant지요.
M$가 비쥬얼 베이직을 주력 개발툴로 하면서 OLE 기능에 포함되게 되었고,
다른 윈도 개발툴인 VC++, 델파이, C++빌더도 당연히 지원하게 되었죠.
C++에서의 Variant는 물론 union을 사용해서 구현되어 있습니다.
그러므로 당연히 Variant 객체 하나가 꽤 많은 메모리를 쓰게 됩니다.
메모리 사용 면에서나 버그 방지를 위해서라도
(void* 포인터를 쓸 때 타입을 혼동하여 생길 수 있는 실수와 같은 맥락이죠)
OLE Automaton을 위해 꼭 필요한 경우외에는 쓰지 않는 것이 좋습니다.
용준 님이 쓰신 글 :
: AnsiString a = "2002"
: AnsiString b = "1"
:
: 여기서
: AnsiString c = a + b 이면 20021
여기서는 AnsiString::operator+(AnsiString&)이 호출되므로
두 문자열이 결합(concatenation)됩니다.
: AnsiString c = a * 10000 + b 이면 20020001
:
: AnsiString c = a * 10000 + b * 100 이면 20020100
:
: AnsiString c = a * 32 + b 이면 64065
여기서는 Variant::operator*(AnsiString&), Variant::operator+(AnsiString&)이 호출되는데,
Variant는 a, b를 숫자로 보고 각각 곱셈과 덧셈을 하게 됩니다.
그 후에 다시 c에는 AnsiString으로 형변환되어 대입됩니다.
베이직에서나 볼 수 있던 현상이 VCL 프로그래밍을 할 때 다시 나타나게 되는 것이죠. -_-;
: 제가 볼때는 좀 이상하군요...
: 단순한 숫자의 연산은 분명 아니군요...
:
: 뭐가 어떻게 되는건지 누가 설명좀 해줘요....
:
|