2014-04-28 6 views
0

매개 변수 생성자를 사용하는 경우 C++에서 기본 생성자를 제공해야합니까? 내 코드는 다음과 같습니다.매개 변수 생성자를 사용하는 경우 C++에서 기본 생성자를 제공해야합니까?

ReadConfigParams::ReadConfigParams(char *file) 
+8

수업에 필요한 것이 있으면 예. 그렇지 않다면, 아니오. – Ben

+0

또한 std :: string을 사용하십시오. – Ben

+4

@ user3159253 :'std :: vector'는 그 요소가 기본 구성 가능하도록 요구하지 않습니다. –

답변

1

클라이언트의 ReadConfigParams 클래스가이 클래스의 개체를 어떻게 생성하는지에 따라 달라집니다.

클래스 ReadConfigParams가 항상 파일 이름을 필요로하는 경우 (대부분의 경우에서와 같이) 연관된 파일없이 ReadConfigParams를 인스턴스화하는 것은 의미가 없으므로 기본 생성자를 정의하면 안됩니다. 이렇게하면 클라이언트가 주어진 파일 이름없이이 클래스의 객체를 생성하는 것을 효과적으로 방지 할 수 있습니다.

그러나 ReadConfigParams 클래스가 일부 기본 구성 값을 제공 할 수 있으면 기본 생성자를 정의해야합니다. 그러면이 클래스의 클라이언트가 파일 읽기 작업없이 기본값을 액세스하고 인스턴스화 할 수 있습니다.

1

일반적으로 클래스의 기본 생성자를 선언하지 않으면 컴파일러에서 자동으로 제공합니다.

아무 생성자도 제공하지 않으면 기본 생성자는 컴파일러에서만 생성됩니다. 예를 들어, 하나의 인수를 취하는 하나의 생성자를 제공하면 컴파일러는 이 아닌을 생성하여 기본 생성자를 생성합니다.

예 1 :

class A 
{ 
}; 

int main() 
{ 
    A a; // OK, as the compiler creates one for you 
} 

예 -2 :

class A 
{ 
public: 
    A(int){} 
}; 

int main() 
{ 
    A a; // NOT OK, error: no appropriate default constructor available! 
} 

실시 예 3 : C++ 11 "에 따라 또한

class A 
{ 
public: 
    A(){} 
    A(int){} 
}; 

int main() 
{ 
    A a; // OK, as you explicitly provide one default constructor 
} 

- ISO-IEC 14882-2011 "§8.5/6 :

프로그램이 const 한정 유형 T의 오브젝트의 기본 초기화를 호출하는 경우 T은 사용자 제공 기본 생성자가있는 클래스 유형이어야합니다.

자세한 내용은 this thread을 확인하십시오.

0

질문 매개 변수 생성자를 사용하는 경우 C++에서 기본 생성자를 제공해야합니까?

응답에 달려 있습니다.

개체 배열을 만들려면 기본 생성자를 제공해야합니다.

ReadConfigParams array[10]; 

은 기본 생성자가없는 경우 작동하지 않습니다. 마찬가지로 operator new을 사용하여 객체의 배열을 할당 할 수 없습니다.

ReadConfigParams* arrayPtr = new ReadConfigParams[10]; 

도 작동하지 않습니다.

배열을 만들 필요가 없으면 스택이나 힙에서 기본 생성자를 제공하지 않아도됩니다.

관련 문제