갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 프로그래밍 (146)
      • 자바 (9)
      • 안드로이드 (2)
      • 유니티 (20)
      • C++ (38)
      • C# (56)
      • HTML (2)
      • 파이썬 (3)
      • 자료구조 (2)
      • 알고리즘 (0)
      • 문제풀이 (4)
      • 디자인 패턴 (7)
      • 카카오톡 봇 (1)
      • 엑셀 (1)
      • 기타 (1)
    • 게임 (21)
      • 테일즈위버 (0)
      • 카이로소프트 (1)
      • 순위 (19)
      • 기타 (1)
    • 일상 (13)
      • 카페 (1)
      • 방탈출 (12)
    • 기타 (6)
      • 웃긴자료 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 게임 디자인 패턴
  • 유니티 그래프 그리기
  • C++ virtual
  • 글로벌게임매출
  • c# delegate
  • 유니티 골드그래프
  • C# boxing
  • 강남 방탈출
  • 알고리즘
  • 게임매출순위
  • c# collection
  • C++ 소멸자
  • Unity Graph
  • c# coroutine
  • c# unboxing
  • c# Thread
  • 전세계 게임 매출
  • pc 게임 순위
  • 게임 매출 순위
  • pc게임 순위
  • C# 예외 처리
  • 롤 골드그래프
  • C++
  • 유니티 그래프
  • 2020년 게임 매출
  • 전세계게임매출순위
  • c# 코루틴
  • C++ 상속
  • 자바
  • 모바일 게임 순위

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

[C++] 초기화 리스트 (member initializer list)
프로그래밍/C++

[C++] 초기화 리스트 (member initializer list)

2019. 11. 5. 00:37
728x90
반응형

1. 멤버 초기화 리스트 (member initializer lists)

#include <iostream>

class Point {
    int x;
    int y;
public:
    Point(int a, int b) : x(a), y(b) { // 멤버 초기화 리스트
        // x = a;
        // y = b;
    }
};

int main() {
    Point p(1, 2);
    
    
    //--
    class a = 0; // 초기화. 생성자 호출
    
    class b;     // 생성자 호출
    b = 0;       // 대입. 대입연산자 호출
}

  ① 멤버 초기화 리스트란?

    => 생성자 괄호 ( ) 뒤에 콜론(:)을 표기하고 멤버를 초기화 하는 것


  ② 특징

    => 대입(assignment)이 아닌 초기화(initialization)

 


2. 반드시 멤버 초기화 리스트를 사용해야 하는 경우

#include <iostream>

class Point {
    const int conv;
    int& r;
    
public:
    Point(int a, int b) : conv(a), r(b) {
        // conv = a; - 대입으로 error
        // r = b;
    }
};

int main() {
    Point p(1, 2);
}

  ① 클래스 안에 멤버 데이터가 const 또는 reference로 되어 있을 때

 

class Point {
    int x;
    int y;
public:
    Point(int a, int b) : x(a), y(b) {}
};

class Rect {
    Point p1;
    Point p2;
public:
    Rect(int a, int b, int c, int d) : p1(a, b), p2(c, d) {}
};

int main() {
    Rect r; // p1 Point 생성자 -> p2 Point 생성자 -> Rect 생성자
}

 

  ② 클래스 안에 디폴트 생성자가 없는 타입이 멤버 데이터로 있을 때

 


3. 주의사항

#include <iostream>

class Point {
public:
    int x;
    int y;
public:
    Point() : y(0), x(y) {}
};

int main() {
    Point p;
    
    std::cout << p.x << std::endl; // 0?
}
x
y

  - 클래스 내부에서 x, y순으로 선언을 했기 때문에 메모리에 위와 같이 x가 앞에 오게 된다.

  - 멤버 초기화 리스트를 사용할 시 대입이 아닌 초기화기 때문에 선언된 순(메모리 순)으로 먼저 초기화 된다.

  - 따라서 위의 경우는 멤버 초기화 리스트 사용시 x가 먼저 초기화 된다. (x에는 쓰레기 값이 들어간다)

 

  ① 초기화 순서

    => 초기화 리스트의 순서대로 초기화 되지 않는다.

    => 멤버 데이터가 놓인 순서대로 초기화 된다.

 


4. 멤버 데이터를 초기화하는 3가지 방법

#include <ioostream>

class Point {
    int x = 0; // C++11 이상
    int y = 0;
public:
    Point(int a, int b) : x(a), y(b) {
        x = a;
        y = b;
    }
};

int main() {
    Point p(1, 2);
}

  ① member field initialization

    => 생성자로 전달된 값을 사용할 수 없다.


  ② member initializer list

    => 가장 널리 사용되는 방법

    => 대입이 아닌 초기화

 

  ③ 생성자 블록 안에서 초기화

    => 초기화가 아닌 대입

 

  - 클래스를 선언과 구현으로 분리 하는 경우

    => 초기화 리스트는 구현부에 작성한다.

728x90
반응형

'프로그래밍 > C++' 카테고리의 다른 글

[C++] 복사 생성자 (copy constructor)  (0) 2019.11.07
[C++] explicit 생성자  (0) 2019.11.06
[C++] 소멸자 (destructor)  (0) 2019.11.04
[C++] 생성자 (constructor)  (0) 2019.10.31
[C++] 접근지정자  (0) 2019.10.29
    '프로그래밍/C++' 카테고리의 다른 글
    • [C++] 복사 생성자 (copy constructor)
    • [C++] explicit 생성자
    • [C++] 소멸자 (destructor)
    • [C++] 생성자 (constructor)
    갓똥
    갓똥
    공부하며 알아가는 내용을 정리해 봅니다.

    티스토리툴바