2008-12-02 4 views

답변

47

기본 매개 변수는 전체 표현식 집합의 하위 집합이 될 수 있습니다. 컴파일시와 디폴트 매개 변수의 선언 장소에서 바인딩되어야합니다. 즉, 함수 호출 또는 정적 메서드 호출이 될 수 있으며 상수 및/또는 전역 변수 또는 정적 클래스 변수가 아니라 멤버 특성이 아니라면 여러 가지 인수를 사용할 수 있습니다.

컴파일 타임 및 함수가 선언 된 위치에서 바인딩된다는 사실은 변수를 사용하는 경우 다른 변수가 원본을 그림자로 표시하더라도 해당 변수가 사용된다는 것을 의미합니다. 함수 호출.

// Code 1: Valid and invalid default parameters 
int global = 0; 
int free_function(int x); 

class Test 
{ 
public: 
    static int static_member_function(); 
    int member_function(); 

    // Valid default parameters 
    void valid1(int x = free_function(5)); 
    void valid2(int x = free_function(global)); 
    void valid3(int x = free_function(static_int)); 
    void valid4(int x = static_member_function()); 

    // Invalid default parameters 
    void invalid1(int x = free_function(member_attribute)); 
    void invalid2(int x = member_function()); 
private: 
    int member_attribute; 
    static int static_int; 
}; 

int Test::static_int = 0; 

// Code 2: Variable scope 
int x = 5; 
void f(int a); 
void g(int a = f(x)); // x is bound to the previously defined x 
void h() 
{ 
    int x = 10; // shadows ::x 
    g(); // g(5) is called: even if local x values 10, global x is 5. 
} 
+0

문제를 명확하게 설명해 주셔서 감사합니다. –

+1

전역 변수를 참조 할 수 있다는 것을 알지 못했습니다. 좋은 자료는 http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/cplr237.htm 및 http : // msdn. microsoft.com/en-us/library/e1dbzf09(VS.80).aspx. –

+5

함수 포인터를 통해 호출 할 수도 있습니다. if foo (int arg = (* fp)()); 여기서 fp는 foo가 선언 된 범위에서 검색되지만 foo()가 호출 될 때마다 * fp가 평가됩니다. – MSalters

11

꼭 그래야 할 필요는 없습니다. 기본 매개 변수는 특정 제한 내의 모든 표현식이 될 수 있습니다. 함수가 호출 될 때마다 평가됩니다.

관련 문제