살군의 보조기억 장치

Another memory device…

class 초기화, member 초기화

leave a comment »

c++98 이후에 정의된 class 초기화와 member 초기화에 대해 정리를 해야겠다는 생각이 들었다. 평소에 자주 보던 문법이 아니라 자꾸 햇갈려서. 특히 base class 생성자의 초기화 부분은 매번 햇갈리다보니 정리를 해 놓아야지 안그럼 또 검색 -> 이해 -> (시간이 지나면) -> 검색 -> 이해… 단계를 계속 할 것 같았다. 말로 설명하는 것 보단, 표준이니까 그냥 코드를 보고 쓰는 방법을 배우면 된다. 자 일단 struct 내용을 살펴보자.

struct Class : public Base
{
    int x;
    int y;

    Class ( int x )
      : Base ( 123 ), // initialize base class
        x ( x ),      // x (member) is initialized with x (parameter)
        y ( 0 )       // y initialized to 0
    {}                // empty constructor body

    Class ( double a )
      : y ( a+1 ),
        x ( y ) // x will be initialized before y, this means that its value here is undefined
    {}          // No base class constructor in list, this is the same as calling Base()

    Class()
    try
      : Base ( 789 ),
        x ( 0 ),
        y ( 0 )
    {
        // no exception
    }
    catch (...)
    {
        // exception occurred on initialization
    }
};

위에 하이라이트한 line:6~10 을 보면 base struct 생성자를 어떻게 정의하는지를 볼 수 있다. class 도 마찬가지로 사용할 수 있다. 여기서 하나 짚고 넘어갈 부분은 line:17 부터 있는 생성자의 try {} catch {} 문이다. 이렇게도 사용할 수가 있는 것이다. 흠흠… 이렇게 사용하는건 처음봤다.

class 의 경우도 사용방법은 동일하다. 예제코드를 보면,

// Declare class MyClass.
class MyClass
{
public:
   MyClass( int rSize ) {}
};

//  Declare class DialogBox, derived from class MyClass
class DialogBox : public MyClass
{
public:
   DialogBox( int rSize );
};

//  Define the constructor for DialogBox. This constructor
//   explicitly initializes the MyClass subobject.
DialogBox::DialogBox( int rSize ) : MyClass( rSize )
{
}

위와 같이 사용이 가능하다. 위의 예는 선언 declaration과 정의definition을 분리한 경우이고 아래 예는 선언과 동시에 정의한 것이다. 사용하는데 햇갈리지만 않으면 어느쪽이든 상관이 없다.

   // ...
   DialogBox( int rSize ) : MyClass( rSize ) {}
   // ...

자바의 super() 와 비슷한 기능을 한다고 볼 수 있다. 혹시 다중상속은 어떻게 쓰는지 궁금하다면 Initializing base classes and members (C++ only)을 보면 된다.

참고
Advertisements

Written by gomiski

2014/02/21 at 1:44 am

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: