Conversion Functions #
변환함수객체를 특정한 타입으로 암시적으로 변환할수 있는 능력을
부여하는 함수입니다.
부여하는 함수입니다.
class String { public: /* ... */ // 변환함수 // 암시적으로 const char* 타입으로 변환하게 합니다. operator const char*() { return pstr; } private: char *pstr; }; int main() { String str; // 변환 함수가 사용됩니다. const char *pstr = str; }
변환함수는 많은 융통성을 제공하고 프로그램하는데 있어
좋은 인터페이스를 제공합니다.
좋은 인터페이스를 제공합니다.
허나 변환함수는 많은 함정을 가지고 있습니다.
의도적이지 않는 형변환으로 인하여 문제를 야기 할수 있습니다.
의도적이지 않는 형변환으로 인하여 문제를 야기 할수 있습니다.
#include <iostream> using namespace std; class String { public: String(const String &str) { pstr_ = new char[strlen(str.pstr_) + 1]; strcpy(pstr_, str.pstr_); } explicit String(const char *pstr = NULL) { pstr_ = new char[strlen(pstr) + 1]; strcpy(pstr_, pstr); } ~String() { delete pstr_; } String& operator=(const String &str) { if (this != &str) { if (pstr_) { delete pstr_; } pstr_ = new char[strlen(str.pstr_) + 1]; strcpy(pstr_, str.pstr_); } return *this; } operator const char*() const { return pstr_; } private: char *pstr_; }; int main() { String str("AAA"); // 컴파일 에러가 생겨야 하지만 문제없이 // 컴파일 됩니다. // 변환함수때문에 포인터값을들 비교하는 // 의도하지 않은 결과가 이루어 집니다. if ("AAA" == str) { /* ... */ } }
때문에 사용을 신중히 하셔야 합니다.
물론 operator==()를 정의했다면 문제는 달라지지만
여하튼 문제의 소지는 있습니다.
여하튼 문제의 소지는 있습니다.
C++표준위원회에서 기획한 std::string 객체도 변환함수를
제공하지 않습니다.
제공하지 않습니다.
대신 .c_str() 이란 멤버함수를 제공함으로서 C타입의 문자열에대해
변환할수 있는 인터페이스를 제공하고 있습니다.
변환할수 있는 인터페이스를 제공하고 있습니다.
참조:
More Effective C++
'Dev > C++' 카테고리의 다른 글
operator overloading 2 (0) | 2008.05.01 |
---|---|
operator overloading 1 (0) | 2008.05.01 |
explicit (0) | 2008.05.01 |
template (0) | 2008.05.01 |
functor - 함수객체 (0) | 2008.05.01 |