nakka soft world !

initialize list, 초기화 리스트 본문

프로그래밍언어/C++

initialize list, 초기화 리스트

nakka 2017. 3. 17. 08:45
728x90

initialize list, 초기화 리스트


1. 개념


class Point

{

int x, y;


public:

Point(int a = 0, int b = 0) : x(a), y(b)  // 초기화 리스트, 진정한 초기화.

{

x = a; // 대입

y = b; // 대입

}

};


int main()

{

int n1 = 0; // 초기화


int n2;

n2 = 0;   // 대입



Object o1 = 0; // 초기화, 생성자.


Object o2; // 생성자

o2 = 0; // 대입, 대입 연산자

}


int와 같은 것는 상관없지만, Object와 같은 거는 생성하고 다시 호출하여 대입하기에 2번 작업 하는것과 동일 효과. 대입보다는 초기화가 빠름.


int main()

{

const int c1 = 0;  // OK

const int c2;  // error

c2 = 0; // error

}


const(상수) 연산자는 초기화로 밖에 값을 넣을 수 밖에 없음.




2. 초기화 리스트가 필요한 경우


class Point

{

int x, y;

const int c;

const int d = 10; // C++ 11에서 부터 허용

int& r;


public:

Point(int a, int b) : x(a), y(b), c(10), r(a)

{

//c = 10; //error. 대입. 반드시 초기화 해야 함.

//r = a; //error. 레퍼런스 멤버

}

};


class Rect

{

Point p1;

Point p1 = Poinㅅ(0, 0); // C++11방식

Point p2;

public:

Rect() : p1(0,0), p2(0,0)

{

// p1(0,0) // 디폴트 생성자가 없는 객체를 멤버로 넣었을때도 초기화 리스트 사용해야함

}

};


초기화 리스트가 반드시 필요한 경우.

1. 상수나 레퍼런스가 멤버로 있을때

2. 디폴트 생성자가 없는 객체가 멤버로 있을때




3. 초기화 리스트 주의 사항

class Point

{

public:

int x, y;

Point() : y(0), x(y) // 미정의 동작(undefined)

{

}

};

-> y=0, x=0으로 처기화 되길 바라나, x가 먼저 선언되어 x(y)가 먼저 실행됨.

즉, y=0, x=쓰레기값 으로 초기화됨



4. 위임 생성자 // C++11

class Point

{

private:

int x;

int y;

public:

Point() : x(0), y(0)

{

Point(0,0); //주의, 생성자 호출 아님, 임시객체를 생성하는 표현

}

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

};

int main()

{

Point p;

}


이전에는 하나의 생성자가 다른 생성자 호출이 불가능했는데, C++11부터는 가능

방법은 초기화 List에 넣어줌. 


class Point

{

private:

int x;

int y;

public:

Point() : Point(0,0)  // 위임 생성자. delegating constructor

{

//Point(0,0); //주의, 생성자 호출 아님, 임시객체를 생성하는 표현

}

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

};

int main()

{

Point p;

}



5. 생성자를 선언과 구현으로 분리 할때 코드 모양

class Point

{

private:

int x;

int y;

public:

Point(int a = 0, int b = 0);

};


Point::Point(int a/* = 0*/, int b/* = 0*/); : x(a), y(b)

{

}

728x90

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

Object Copy  (0) 2017.03.17
복사 생성자 (Copy Constructor)  (0) 2017.03.17
소멸자  (0) 2017.03.16
default function, delete function  (0) 2017.03.16
생성자 (construct)  (0) 2017.03.16
Comments