2013-06-25 5 views
-1

함수 또는 생성자의 헤더에 변수를 할당하는 것이 이점 (있는 경우)은 무엇입니까? 즉, 다음 두 코드 집합의 차이점은 무엇이며 왜 다른 코드 집합을 선호합니까?함수 헤더의 변수 할당

예 1

class A { 
private: 
    char* b; 
public: 
    A(size_t var = 8*1024*1024) { 
    ... 
    b = new char[var]; 
    ... 
    } 
    ... 
}; 

예 2

class A { 
private: 
    char* b; 
public: 
    A() { 
    const size_t var = 8*1024*1024; 
    ... 
    b = new char[var]; 
    ... 
    } 
    ... 
}; 

난 의제 입력을 평가한다.

+1

하나를 사용하면 배열 데이터 멤버의 크기를 설정할 수 있으며 다른 하나는 배열 데이터 멤버의 크기를 설정할 수 없습니다. – juanchopanza

답변

6

기본 인수입니다. 호출자는 인수를 전달하지 않고 함수를 호출 할 수 있습니다.이 경우 기본값이 사용됩니다.

그래서 첫 번째 예에서, 하나는 호출 할 수

A* myADefault = new A(); // creates A with default value (8*1024*1024) 
A* myLargerA = new A(16*1024*1024); // creates A passing 16*1024*1024 instead of the default 

(자세한 정보를 원하시면, "매개 변수에 기본값"를 보면이 튜토리얼의 섹션 http://www.cplusplus.com/doc/tutorial/functions2/)

+0

왜 모든 포인터와'new'입니까? – juanchopanza

+0

@juanchopanza 방금 생성자를 호출하는 것에 대해 명시하고 싶었습니다. 명시 적으로 생성자가 인수없이 호출되었다는 것을 명시 적으로 나타 내기 위해'A a(); '를 사용하려고했지만 컴파일러가 함수 선언으로 해석하면 혼란 스럽습니다 ...: P – filipe

+1

아, 알겠습니다. C++ 11에서는'{}'을 사용할 수 있습니다. 'A a = A()'라고 말할 수 있습니다. – juanchopanza

2

정말 다릅니다.

첫 번째 값은 기본값을 나타내므로 A test 또는 A test2(42)을 선언 할 수 있습니다. test에서 b의 크기는 8 * 1024 * 1024입니다. test2에서 b의 크기는 42입니다.

두 번째 코드 단정 값입니다.

당신은 당신의 필요에 따라 다른 하나를 prefere 것

...

1

당신이 쓴 것은 서로 다른 두 가지 존재입니다. 첫 번째 예에서 var는 input parameter with a default value이 8 * 1024 * 1024이고 두 번째가 local const variable입니다. 행동이 같더라도 내부 구조는 그렇지 않습니다.

하나의 방법이 다른 것보다 우선적으로 사용되는지에 대한 질문은 디자인에 따라 달라집니다. 전자는 약간의 유연성을 추가 할뿐 아니라 숨겨진 상태로 유지해야하는 매개 변수를 노출하지만 후자는 더욱 엄격합니다. 오류가 발생하기 쉽습니다.

0

그러나 어느 경우도 특히 좋습니다. 멤버 변수는 생성자 초기화 목록에서 초기화해야합니다. 이는 예를 들어 const 멤버 변수를 초기화하는 유일한 방법입니다.

class A { 
    private: 
     char* b; 
    public: 
     A(size_t var = 8*1024*1024): b(new char[var]) { 
      ... 
     } 
     ~A() { 
      delete [] b; 
     } 
}; 

그럼에도 스마트 포인터는 b의 경우 더 좋을 것입니다.