You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
int x = 0; // int 직접 초기화constchar * text = "HELLO"; // 포인터 직접 초기화double d;
std::cin >> d; // 입력 스트림에서 읽음으로써 초기화
생성자에서 지킬 규칙은 "객체의 모든것을 초기화 하자"이다.
대입을 초기화와 헷갈리지 않는 것이 중요하다.
생성자에서 대입문을 사용하지 않고 이니셜라이저를 사용한다.
classA{
public:int x;
int y;
// 초기화를 사용한 생성자A(int theX, int theY)
{
x = theX;
y = theY;
}
// 이니셜라이저를 사용한 생성자A(int theX, int theY) : x(theX), y(theY) {}
};
tfs가 tempDir보다 먼저 초기화 되지 않으면 tempDir의 생성자는 tfs가 초기화 되지도 않았는데 tfs를 사용하려고 할것이다.
서로 다른 단위에 전의된 비지역 정적 객체들 사이의 상대적인 초기화 순서는 정해져 있지 않다.
여러 단위에 있는 비지역 정적 객체들의 초기화 순서문제는 피해서 설계해야한다. (비지역 정적 객체를 지역 정적 객체로 바꾸는것을 통해)
설계에 약간의 변화만 주면 문제를 봉쇄할 수 있다.
비지역 정적 객체를 하나씩 맡는 함수를 준비하고 이 안에 각 객체를 넣는 것이다.
classFileSystem {...}; // 이전과 동일
FileSystem& tfs() // tfs 객체를 이 함수로 대신한다.
{ // 이 함수는 클래스 안에 정적 멤버로 들어가도 된다.static FileSystem fs; // 지역 정적 객체를 정의하고 초기화한다.return fs; // 이 객체에 대한 참조자를 반환한다.
}
classDirectory {...}; // 이전과 동일Directory::Directory(params) // 이전과 동일하다. tfs의 참조자였던 것이 tfs()로 바뀌었다는 것만 다르다.
{
...
std::size_t disks = tfs().numDisks();
...
}
Directory& tempDir() // tempDir 객체를 이 함수로 대신한다.
{ // 이 함수는 Directory 클래스의 정적 멤버로 들어가도 된다.static Directory td; // 지역 정적 객체를 정의/초기화한다.return td; // 이 객체에 대한 참조자를 반환한다.
}