2005년 5월 17일 화요일

C++, Java 생성자에서 다른 생성자 부르기

C++에서는 생성자가 다른 생성자를 부르면
Temporary Object가 생겼다가 다시 소멸해 버린다.
따라서
obj = new Object명(인수); 라는 구문을 주었을 때.

heap에 object가 하나 만들어지고 그것의 생성자가
또 object를 만들어서 stack에 저장된다.
obj에는 stack의 pointer가 들어가서 stack에서 return된 후 object 사라지므로 invalid한 pointer가 되버린다.

따라서 그런 짓은 하지 않는 것이 좋다.
------------------------------------------------------
$ cat ./cpp_test3.cpp
#include <iostream>

using namespace std;

class B
{
    public:
    int m_i;
    char m_c;

    B(int i) : m_i(i)
    {
        cout << "B::B(int " << i <<  "), this:" << this << endl;
        B('z');
    }

    B(char c) : m_c(c)
    {
        cout << "B::B(char " << c << "), this:" << this << endl;
    }

    ~B()
    {
        cout << "B::~B(), this:" << this << ", m_i:" << m_i << ", m_c:" << m_c << endl;
    }
};

int main()
{
    B* p;
    p = new B(1);
    cout << "p:" << p << endl;
    cout << "p->m_i:" << p->m_i << endl;
    cout << "p->m_c:" << p->m_c << endl;
    delete p;

    return 0;
}
[ilashman@ob cpp_test]$ ./cpp_test3
B::B(int 1), this:0x8049f88
B::B(char z), this:0xbfffd550
B::~B(), this:0xbfffd550, m_i:-1073752680, m_c:z
p:0x8049f88
p->m_i:1
p->m_c:
B::~B(), this:0x8049f88, m_i:1, m_c:

----------------------------------------------------------
Java에서는 생성자가 다른 생성자를 불러도 된다.
다만 생성자가 다른 생성자를 부를 때는 첫번째 줄에서 불러야 한다.
(그렇지 않으면 compile시에 에러가 난다.)
생성자를 부를 때도 class명()라고 부르지 않고 this()라고 불러야 한다.
그리고 소멸자와 포인터가 없다.

$ cat C.java
class B {
    public int m_i;
    public char m_c;

    public void hi()
    {
        System.out.println("hi");
    }

    public B(char c)
    {
        m_c = c;
        System.out.println("B::B(char " + c + "), this:" + this);
    }

    public B(int i)
    {
        this('z');
        m_i = i;
        System.out.println("B::B(int " + i +  "), this:" + this);
        hi();
    }

    /*
    public ~B()
    {
        System.out.println("B::~B(), this:" + this + ", m_i:" + m_i + ", m_c:" + m_c);
    }
    */
}

class C {
    public static void main(String[] args) {
        B p = new B(1);
        System.out.println("&p:" + p);
        System.out.println("p.m_i:" + p.m_i);
        System.out.println("p.m_c:" + p.m_c);
    }
}

$ ~/local/j2sdk1.4.2_08/bin/java C
B::B(char z), this:B@14f8dab
B::B(int 1), this:B@14f8dab
hi
&p:B@14f8dab
p.m_i:1
p.m_c:z

댓글 없음:

댓글 쓰기