2016-12-04 5 views
4

에 C++ 클래스 초기화 :관용구 다음 C++ 클래스를 고려 제로

struct Point 
{ 
    int x; 
    int y; 

    explicit Point() =default; // 1 
    explicit Point(int x_, int y_): x(x_), y(y_) { } // 2 
}; 

번째 생성자 특정 xy 값과 함께 Point를 만드는 데 유용하다. 처음에는 Point을 기본값으로 만들 수 있습니다. 그러나 효율성을 위해 default ed이고 xy을 0으로 설정하지 않습니다.

explicit Point(int val) : x(val), y(val) { } // 3 

이 방법은, 내가 Point를 초기화 기본 중 하나를 선택하거나, 모든 회원이 0으로 설정되고 그것을 초기화 할 수 있습니다 :

를 내가 영으로 모든 회원을 설정할 않은 경우, 나는 또 다른 생성자를 가질 수있다
Point p1; // Don't initialize members. 
Point p2(0); // Initialize all members to zero. 

세 번째 생성자의 문제점은 제로가 아니라 모든 값을 전달할 수 있다는 것입니다. 예를 들면 :

Point p(1); // Both x and y set to 1! Is this the intent? If so, 
      // probably should have used Point p(1, 1) instead. 

또 다른 방법은 제로 또는 기본 값을 나타내는 특별한 유형이 생성자에게 그것을 전달하는 것 :

: Default과 같이 간단하게 정의 할 수 있습니다

explicit Point(Default) : x(0), y(0) { } // 4 

그런 다음

struct Default { }; 

, 나는 Point을 할 때 내가 제어 할 수는 기본값으로 초기화합니다 :

Point p1;   // Don't initialize members. 
Point p2(Default()); // Initialize members with default values. 

어떤 방법이 더 좋을지는 모르겠지만, 센티넬 유형 Default (no. 4) 또는 단일 값을 가져 와서 모든 구성원을 해당 값 (3 번)으로 초기화하는 생성자? 두 가지 방법의 장점/단점은 무엇입니까? 아니면 이것을하기위한 더 좋은 메커니즘이 있습니까?

편집 :이 간단한 클래스는 일러스트레이션으로 선택되었습니다. 실제로는 이 "초기화 됨"으로 간주되는 특정 기본값을 필요로하는 더 많은 구성원이있을 수 있습니다..

+1

값 초기화를 사용할 수도 있습니다. 'Point p {};'. – juanchopanza

답변

10

은, 여러분의 인생을 더 쉽게 확인이 집계과 같은 간단한 데이터 구조체를 만들 :

struct Point 
{ 
    int x; 
    int y; 
}; 

을 이제 집계 초기화를 사용할 수 있습니다

Point p;  // members uninitialized 
Point p{}; // members set to 0 
Point p{1,2}; // members set to 1,2 
2

내가보기에 가장 일반적인 방법은 원하는 모든 기본값으로 설정된 클래스의 모든 구성원을 포함하는 초기화 목록을 사용하여 no 인수 생성자를 구현하는 것입니다.

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

이 뒤에 이유는 아마 당신은 몇 가지 알려진 값으로 멤버를 초기화하지 않고 객체를 인스턴스화하고 싶지는 않을 것입니다, 그래서 당신은 실제로 기본 생성자가 존재하는 것을 원하지 않는다.

+0

이것이'std :: complex'에 대한 접근 방법이라고 생각합니다. –

0

또 다른 옵션은 사용하는 것입니다

struct Point 
{ 
    int x; 
    int y; 

    explicit Point(int x_ = 0, int y_ = 0): x(x_), y(y_) {} 
}; 

Point p1;  // 0, 0 
Point p2(1);  // 1, 0 
Point p3(1, 10); // 1, 10