explicit #

암시적으로 클래스 타입으로의 형변환을 막는 키워드 입니다.

비교적 C++표준의 후반부에 채택된 사항이며 클래스의 생성자에 사용하는
키워드 입니다.

어떤 타입(객체)에서 특정 타입으로의 암시적인 형변환은 파라미터가 1개인
생성자에 근거하여 이루어 집니다.

#include <iostream>
using namespace std;

class CInt
{
public:
        CInt() {}
        CInt(int n) : n_(n) {}
        ~CInt() {}

        operator int()
        {
                return n_;
        }

private:
        int n_;
};


int main()
{
        CInt Number;

        // 파라미터가 1개인 생성자인 
        // CInt(int n)에 근거하여 암시적인 
        // 형변환이 이루어 집니다.   
        Number = 34;


        // operator int()의 변환연산자를 통하여 
        // CInt객체가 int 형으로 암시적으로 형변환이 
        // 가능합니다. 
        int n = Number;
}
위의 예제는 int형의 객체를 나타내는 CInt클래스를 표현 해봤습니다.
CInt 클래스에서는 int 형에서 CInt형으로의 변환이 타당해 보입니다.

허나 다음 예제를 보시면 ...

#include <iostream>
using namespace std;

// String 타입의 배열객체 
class StringVector
{
public:
        // 디폴트생성자   
        StringVector() {}

        // n개의 String형의 배열 객체를 생성합니다. 
        explicit StringVector(int n) {}

        ~StringVector() {}
};


int main()
{
        StringVector vec;

        // 이것은 아무의미가 없습니다. 
        // 컴파일러에 의해 막아줘야 합니다. 
        // 이때 사용하는 것이 
        // explicit 키워드 입니다. 
        // 아래의 문장은 컴파일러에 의해 에러를 보고 할것 입니다. 
        vec = 34;
}

String 타입의 배열객체에 대해 int타입을 대입하는것은 의미가 없습니다.
그러나 파라미터가 한개인 생성자에 의해 암시적으로 형변환이 가능합니다.

이것을 막아주기 위해서는 파라미터가 한개인 생성자에 explicit 제한자를 부여해
암시적인 형변환을 막아줍니다.

'Dev > C++' 카테고리의 다른 글

operator overloading 1  (0) 2008.05.01
Conversion Functions - 변환함수  (0) 2008.05.01
template  (0) 2008.05.01
functor - 함수객체  (0) 2008.05.01
Casting operators  (0) 2008.05.01

+ Recent posts