2009-12-04 3 views
3

클래스의 메서드에 대한 변수의 기본값이 정적이 아닌 메서드 나 같은 클래스의 멤버가 될 수없는 이유를 알고 싶었습니다.변수가 비 정적 메서드 나 클래스의 멤버가되도록 C++에서 기본값을 허용하지 않는 이유는 무엇입니까?

이유가 있습니까? 컴파일러가 정적이 아닌 기본값 클래스의 위치를 ​​메서드에 제공 할 수 없습니까?

Google은 답변을 빨리 찾으려고했지만 좋은 답변을 찾을 수 없었습니다.

편집 : 여기 예가 있습니다.

class ClassTemp 
{ 
    static int s_member; 

    int MagicOperation(int defaultValue = s_member) 
    { 
    return defaultValue; 
    } 
}; 

하지만이되지 않습니다 : :

이 법적으로 내 머리 위로 떨어져

class ClassTemp 
{ 
    int m_member; 

    int MagicOperation(int defaultValue = m_member) 
    { 
    return defaultValue; 
    } 
}; 
+2

무슨 뜻인지 예제 코드를 제공해 줄 수 있습니까? 일부 멤버 함수의 결과로 클래스 멤버 값을 초기화 하시겠습니까? – catchmeifyoutry

+1

예, 명확히하십시오. "default value"로 필드 이니셜 라이저를 의미하는 경우 C++의 인스턴스 필드에 존재하지 않는 것보다'public : int x = 123; '은 이미 오류입니다. 생성자에서 이니셜 라이저 목록을 의미한다면 멤버 함수를 호출 할 수 있습니다. 즉,'struct foo {int bar; int baz(); foo() : bar (baz()) {}}'- 그러나 일부 컴파일러는 경고를합니다. –

답변

5

기본 인수는 호출자의 컨텍스트에서 평가되므로 클래스 메서드의 컨텍스트가 아니라 호출자의 컨텍스트 ("매개 변수"가 아닌 "인수)"라고합니다. 즉, 이러한 비 정적 인수를 평가하려면 컴파일러가 이러한 기본값을 가져올 특정 클래스 인스턴스를 알아야합니다.

물론 이론적으로 비 정적 멤버를 기본 매개 변수로 사용하고 컴파일러가 멤버 호출에 지정된 클래스 인스턴스를 사용하도록 허용 할 수 있습니다. 그러나 그것은 나에게 일을하는 "C++ way"처럼 들리지는 않습니다. 또한 메소드가 가상 인 경우와 같이 좀 더 복잡한 경우에는 복잡하고 세련되지 않은 사양으로 이어질 수 있습니다.

0

, 당신은으로 전화하는거야 클래스의 인스턴스에서 기본 매개 변수를 허용 요구 포인터 앞에 스택에 함수 인수가 푸시되기 때문에 호출하기 전에 멤버 값을 "derefing"합니다.

둘째,의 효과에 기본값을 사용하는 방법에 대한 모든 호출에 작은 오버 헤드가 될 것이다 :

push provided arguments... 
push (this->member) 
push this 

이는 꽤 모호한 카운터 인수, 내가 왜 할 수없는 이유를 볼 수 없습니다 둘 중 하나를 수행하십시오.

1

정적이 아닌 멤버는 개체에 바인딩되어 있으며이 개체에 액세스하려면 'this'포인터가 필요합니다. 이 포인터는 기본 vaules에 사용할 수 없으므로 허용되지 않습니다.

+0

왜 사용할 수 없습니까? 어쨌든 메서드를 호출하기 위해 잠시 후 사용할 수 있습니다. –

+1

메소드 코드는 모든 클래스에서 공유됩니다.그래서 값을 가져와야하는 클래스의 인스턴스가 여러 개 있다면? – Naveen

+0

t9를 사용하는 휴대 전화로 응답. 이전 메모에서 읽음 :-) – Naveen

0

이 메서드를 초기화하는 비 정적 변수가 컴파일러에 있는지 여부를 컴파일러에서 알 수 있기 때문에 질문을 이해할 수 있습니다. - 따라서 요구 사항 static이기 때문에 메소드 var가 초기화 될 때 존재한다는 것이 보장됩니다. 그것은 그것을 찾는 문제가 아닙니다.

관련 문제