// explicit 없이 암시적인 변환을 막는다.(간접층 사용! proxy)

class Stack

{

        struct ploxy{

               int *buf;

               int top;

 

               proxy(int _sz):top(_sz),buf(new int[_sz])

               {

                       cout << "ploxy()" << endl;

               }

               ~proxy()

               {

                       cout << "~ploxy()" << endl;

                       delete buf;

               }

        };

        int * buf;

        int top;

 

public:

 

        Stack(proxy a):buf(a.buf),top(a.top)

        {

               cout << "Stack()" << endl;

        }

};

 

void foo(Stack s)

{

        cout << "foo()" << endl;

}

 

void main()

{

        Stack s(10);

        foo(s);

        //foo(100); //error

}

 //////////////////////////////////////////////////////////////////////////
class
Stack

{

        int* buf;

        int top;

public:

        // 인자1개인생성자가암시적인변환의의미로사용되는것을막는다.

        // , 명시적변환은허용된다.

        explicit Stack( int sz = 10 ) {}

};

 

void foo( Stack s )

{

}

 

void main()

{

        Stack s;

        foo( s );

 

        foo( 100 );
         // 100 -> stack
이라면가능int->stack(변환생성자, 인자개인생성자!!

}

//////////////////////////////////////////////////////////////////////////
//
변환이야기.


void main()

{

        int n;

        cin >> n;      // 만약문자를입력하면실패한다.

 

        if( cin )
// cin.operaotr bool()
로변환되면가능하다. cin은객체이지만if문안에들어갈수이유는???

// 실제로는cin.operator void*()로되어있다.

        {

               cout << "성공" << endl;

        }

}
//////////////////////////////////////////////////////////////////////////

class Point

{

        int x;

        int y;

public:

        // 인자가1개인생성자=> 변환생성자라고불린다.

        Point( int a ) : x(a), y(0) {}

 

        Point( int a = 0, int b = 0 ) : x(a), y(b) {}

 

// 변환연산자: Point int로변하게된다. 리턴값을표기하지않는다. 함수이름에리턴값있다.!!

        operator int()

        {

               return x;

        }

};

 

void main()

{

        Point p( 1, 2 );

        int n = 10;

 

        p = n;                 // int -> Point로변환되게한다. 변환생성자

 

        double d = 3.2;

        int n = d;

 

        Point p1( 1, 2 );

 

        int n2 = p1;   // ?Point -> int로변환p1.operator int() 가있으면된다.

}

 

Tag |

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다