C++ / member 초기화 / explicit 생성자 / vector 초기화

jaeha_lee·2022년 5월 10일
0
class Object{
	const int c;
    int &r;
public:
	Object(int n, int& x){ 
    	// 상수와 참조 변수는 반드시 초기화하여 사용하여야 한다.
        // 하지만 이 경우는 객체를 생성 후 초기화하는 방법이다.
        // 그렇기 때문에 틀린 방법
    	c=n;
        r=x;
    }
    Object(int n, int& x) : c{n},r{x} // 이게 맞는 표현
    {}

}

객체를 생성하면 모든 멤버 데이터의 생성자도 호출된다.

class Rect{
	Point leftTop; // Point의 경우 디폴트 생성자가 없다고 가정하자
    Point rightBottom;
public:
	Rect(int x1,int y1, int x2, int y2) : leftTop{x1,y1},rightBottom(x2,y2)
    {}// 이렇게 해주어야 함
}
  • 즉, member initializer 를 사용해야하는 경우
    • 멤버 데이터로 상수나 참조가 있는 경우
    • 디폴트 생성자가 없는 타입이 멤버로 있는 경우
  • 멤버 데이터가 선언된 순서 대로 초기화 됨
class Point{
public:
	int x;
    int y;
    Point():y{10}, x{y} {} 
    // 이 경우 에러 발생. x=y, y=10 이 순서대로 실행 됨
}
class Point{
public:
	int y;
    int x;
    Point():y{10}, x{y} {} 
    // 이 경우 해결. 멤버 데이터 선언 순서만 변경
}
  • explicit 생성자
    • Direct 초기화만 가능, copy 초기화는 사용 불가
    • 대표적으로 vector가 explicit
      • vector v1(10); (가능) / vector v2=10; (불가능)
    • string의 경우 explicit이 아님
      • string s1("test") / string s1 = "test"
  • vector 초기화
vector<int> v(10); // 크기가 10개인 vector
vector<int> v{10}; // 크기가 한개, 초기값이 10인 vector

0개의 댓글