폼에 메모장, 버턴 하나 올려 놓고 다음을 붙여 넣기 해서 실행해 봅시다.
#include <stdio.h>
//---------------------------------------------------------------------------
inline char* __fastcall operator ~(const AnsiString& s)
{
return s.c_str();
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String test = "100 이것은 ~연산자로 String을 보다 쉽게 쓰게 해줍니다.";
char *p = ~test + 4;
Memo1->Lines->Add(p);
int n = atol(~test);
Memo1->Lines->Add(n);
String test2 = "12345 한글";
char buf[100];
sscanf(~test2, "%d %s", &n, buf);
Memo1->Lines->Add(n);
Memo1->Lines->Add(buf);
strcpy(buf, ~test);
Memo1->Lines->Add(buf);
}
//---------------------------------------------------------------------------
String 은 델파이의 string 내부 키워드를 C++빌더로 옮겨 놓은 것입니다.
정식 명칭은 AnsiString 인데, 보통 String으로 간편하게 사용합니다.
그래서 String은 델파이 string과 호환을 가질뿐 아니라 C++ 특유의 객체적인 기능까지 부가되어 있어
델파이 string 보다 강력하고 쓰기 좋게 설계되어 있습니다.
하지만 델파이 키워드를 옮겨 구현한 클래스이기 때문에 상속을 받아 기능을 수정할 수 없는 것이 단점입니다.
String과 비교되는 VC의 문자열 클래스는 CString입니다.
CString은 빌더 String보다 성능은 떨어지지만 나름대로 편리한 문자열 형입니다.
CString은 C++ 클래스이기 때문에 상속을 받는 것도 가능하고 기능을 수정하는 것도 가능합니다.
몇해전에 CString을 빌더 버전으로 옮겨 본 일이 있는데, 빌더에서 String, CString을 동시에 쓰는 것은 즐거운 일이더군요.
그런데 String 이 CString보다 현실적으로 불편한 것은 char* 형이 요구되는 곳에는
CString 형 변수는 그냥 변수명만 기입하면 되는데, 빌더는 변수명.c_str() 식으로 항상 사용해야 합니다.
VC:
CString str = "test";
sscanf(str, "%s", temp);
빌더:
String str = "test";
sscanf(str.c_str(), "%s", temp);
큰 불편이라고하는 할수 없고 불만 사항도 아니지만,
좀 더 간편하게 쓸수 없을까 생각하다가 String을 상속받아 기능을 수정하는 것은 불가능하니
연산자를 동원하는 방법으로 해결해 봤습니다.
~ 연산자는 사실 실무에서는 잘 쓰는 일이 없는
1의 보수를 구하는 연산자입니다. 1의 보수는 ~ 연산자보다는 ^ 0xffff 식이 더 많이 쓰입니다.
그리고, 클래스 소멸자에 붙는 ~와는 완전히 다른 것입니다.
~ 연산자를 오버로딩한다고 해서 기존 정수에 대한 ~ 연산자 기능은 아무런 지장 없이 사용할 수 있습니다.(너무 당연)
그래서 ~를 이용해 char* 가 필요한 곳에는 다음과 같이 쓸수 있습니다.
String str = "test";
sscanf(~str, "%s", temp);
실무에 전혀 무리 없이 쓸수는 있습니다만
어째 좀 잘한 것 같지는 않는데...
심심해서 만들어 본 꼼수 팁이었습니다.
ㅡ,.ㅡ;
|
c_str() ...
불편함을 느끼면서도 개선해서 써야겠다는 생각을 해보진 못했네요
~ 연산자.. 저는 업무에 가끔 쓰곤 하는데...
하여간 함 써봐야 겠네요 유용할듯...