The method of initialize variable during generate class

class에서 instance가 생성될 때 class 내부 변수를 초기화 하는 방법은 세 가지가 있다.

  • class member variable define with  initialize
  • constructor initialize list
  • init at the constructor { }


첫 번째는 c++11 이상부터 가능

두 번째와 세 번째의 차이점은 이전 글 보기.



The order of initialize variable

결론부터 말하면 Initialize list 가 가장 빨리 선언되고, 그 다음 member variable define, init at the constructor { } 순으로 변수 초기화가 이뤄진다. 아래 예시에서 보면 알 수 있지만 Initialize list 가 실행되면 Member variable define 자체가 실행되지 않는다. 그리고 Initialize list 가 선언되어 있지 않다면 Member variable define과 Init at the constructor { } 과정이 실행된다. 즉 initialize가 두 번 발생함.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Test
{
private:
    int m_a = printf("member variable m_a init\r\n");
    int m_b = printf("member variable m_b constructor init\r\n");
    int m_c = printf("member variable m_c no init\r\n");
    int m_test;
 
public:
    Test (): m_a(printf("m_a initialize list\r\n"))
    {
        m_b = printf("m_b constructor init\r\n");
    }
 
    ~Test()
    {}
};
 
int main()
{
    Test default_test;
 
    return 0;
}
 
cs

------------ 결과 ------------

m_a initialize list
member variable m_b constructor init
member variable m_c no init
m_b constructor init


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

모듈러란? (Mod)  (1) 2019.05.11
생성자에 콜론( : ) 를 쓰는 이유  (0) 2019.05.10
structure operator  (0) 2019.05.09
Posted by 나무길 :

모듈러란? (Mod)

2019. 5. 11. 11:14 from Language/C++

모듈러란?


어떤 정수A를 다른 정수 N으로 나누면 나오는 나머지


수학의 분야 중의 정수론에서 배우게 되는 모듈러는 어떤 정수 A를  다른 정수 N으로 나누면 나오는 나머지 라는 뜻으로 식으로는 A modulo N 이라고 적는다. (modulo를 줄여서 mod라고도 적는다.) 


c 에서는 %를 사용하여 A % N 이라고 사용한다. c++ 에서는 var A mod N; 이라고 사용한다.


Posted by 나무길 :

명칭과 기능


Foo(int num): bar(num) 은 초기화 리스트라하고, bar 를 num 으로 초기화하는 역할을 한다.


//초기화 리스트
Foo(int num): bar(num) {};
 
//함수에서 초기화
Foo(int num)
{
   bar = num;
}
cs


그냥 생성자 함수{} 내에서 초기화하는 것과, 이렇게 초기화 리스트를 쓰 는것의 차이는 초기화 리스트에서 초기화를 하는 경우, 생성자가 호출될 때 객체의 생성과 초기화가 한 번에 이루어진다.


생성자 함수 내 { } 에서 초기화를 하는 경우, 객체가 생성되어, default생성자로 초기화된 상태에서 다시 한 번 할당받게 하게 됩니다. 이 경우엔 default할당-유저할당의 2단계를 거치게 돼서 오버헤드가 생긴다.


초기화 리스트를 써야만 하는 상황은 크게 다음과 같다.


  • 클래스가 레퍼런스를 멤버로 가질 때
  • non static const멤버가 있을 때
  • default 생성자가 없을 때
  • base class를 초기화할 때
  • 생성자 파라미터의 이름이 데이터 멤버랑 같을 때(이 경우는 this를 써서 해결할 수도 있다.




초기화 리스트를 써야만 하는 상황


class MyClass
{
    public:
        int &i; //레퍼런스 멤버. 초기화 리스트를 써야 함
        int b;
        //Non static const 멤버. 초기화 리스트를 써야 함
        const int k;  
    //생성자 파라미터의 이름이 데이터 멤버랑 같음. 초기화 리스트를 쓸수 있음(선택 가능)
    MyClass(int a, int b, int c):i(a),b(b),k(c)
    {
        /*
        초기화 리스트를 쓰고 싶지 않은 경우
        this->a = a
        같이 써야 함
        */
    }
};
class MyClass2:public MyClass
{
    public:
        int p;
        int q;
        //base class인 MyClass가 default생성자가 없기 때문에 무조건 초기화 리스트에서 초기화해줘야 함
        MyClass2(int x,int y,int z,int l,int m):MyClass(x,y,z),p(l),q(m)
        {
        }
};
int main()
{
    int x = 10;
    int y = 20;
    int z = 30;
    MyClass obj(x,y,z);
    int l = 40;
    int m = 50;
    MyClass2 obj2(x,y,z,l,m);
    return 0;
}
cs


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

class 초기화 순서 initialize list, in constructor, member variable  (0) 2019.05.25
모듈러란? (Mod)  (1) 2019.05.11
structure operator  (0) 2019.05.09
Posted by 나무길 :