nakka soft world !
initialize list, 초기화 리스트 본문
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)
{
}
'프로그래밍언어 > 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 |