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

+ Recent posts