2011-01-30 4 views
0

누구나 메인에서 g로 넘어갈 때 어떤 일이 일어날 지 말해 줄 수 있습니까? static_cast입니까? 위의 코드는 아래와 같은 때문에const를 캐스팅하여 참조를 취하는 함수로 전달하려면 어떻게됩니까?

int & g (int&x){x++ ; return x ; } 
int main() 
{ 

    const int a=5 ; 
    cout<<g((int&)a)<<endl; 
} 

내가 어떤 사본이 이루어지지 않습니다 확신 : 사전에

class A 
{ 
public: 
    A() 
    { 
     cout << "calling DEFAULT constructor\n\n"; 
    } 
    A(A& Other) 
    { 
     cout << "Calling COPY constructor\n\n"; 
    } 
    ~A() 
    { 
     cout << "Calling DESTRUCTOR\n\n"; 
    } 
}; 

A& g(A& x) 
{ 
    cout << "Inside g(A& x) \n\n"; 
    return x; 
} 

void main() 
{ 
    const A a; 
    g(const_cast<A&>(a)); 
}*/ 

감사합니다 :)

+3

[ 'main'의 반환 유형은 항상 int입니다.] (http://stackoverflow.com/questions/4207134/what-is-the-proper-declaration-of-main/4207223#4207223). –

+0

@James : 표준이라고 말하는가? 내가 비표준이라고 쓴 것은 무엇입니까? 나는 당신의 대답을 기다리고있다. 그리고 고마워한다 :) –

+0

그냥 마지막 질문이다. "a"를 변수가 아닌 const로 만들면 무엇이 적용 되는가? 답변 해 주신 모든 분들께 감사드립니다 :) –

답변

8

static_cast const와 제거 할 수 없습니다. 이것은 const_cast입니다.

const 개체를 수정하기 때문에 런타임에이 코드 (첫 번째 예)에서 정의되지 않은 동작이 발생합니다.

+0

죄송합니다. const_cast 대신 static_cast를 작성하고 썼습니다. 응답 해 주셔서 감사합니다. –

+0

정의되지 않은 동작이 런타임에만 한정되어 있습니까? 또는 컴파일러가 위반 사항을 감지하고 컴파일 할 때 컴퓨터를 재부팅 할 수 있습니까? – fredoverflow

+2

@Fred : 내가 이해할 때 표현식은 평가 될 때 정의되지 않은 동작 만 산출한다는 것을 이해합니다. 그래서, 표현식이 평가 될 것이라는 보장이 없으므로 (예를 들어, 다른 번역 단위가'std :: exit()'을 호출하는 정적 초기화를 가질 수 있으며, 'main()'이 입력되면 표현식은 평가되지 않습니다.) –

0

int의 경우 참조를 전달하는 데 필요한 코드가 없습니다. 캐스트를 사용하면 컴파일 할 수 있습니다.

+0

알아,하지만 컴파일러가 암시 적으로 수행하는 것은 무엇입니까? –

+1

int의 비트는 참조와 같지 않으므로 확실히 캐스트를 재 해석하지 않습니다. int는 가상 함수를 가진 클래스가 아니기 때문에 분명히 동적은 아닙니다. int &는 int의 수퍼 클래스가 아닙니다.constness를 변경할 수 없기 때문에 정적 일 수 없습니다. 그래서, 그것이 무엇이든간에, 그것은 const입니다. 그러나 구식 주조공은 새로운 스타일이하는 것을해야한다고 말하는 것은 없습니다. –

+2

실제로 C 스타일의 캐스트는 static, const 및 reinterpret 캐스트로 지정되므로 항상 이러한 세 가지 조합을 수행합니다 (일부 동작은 약간 다릅니다. 예를 들어 C 스타일 캐스트는 확인하지 않습니다. 정적 캐스팅을 수행하기 전에 기본 클래스 액세스 가능성을 유지하므로 C 스타일 캐스팅을 사용하여 전용베이스로 캐스팅 할 수 있지만 정적 캐스팅은 사용할 수 없습니다. –

1

C 스타일의 캐스트는 악의적 인 일입니다. reinterpret_cast<> 또는 const_cast<>의 모든 작업을 수행합니다. 그것은 C가 올바르게 악명 높은 "전기 톱 사용의 용이성을 가진 전기 톱의 힘"중 하나입니다.

C++ 스타일의 캐스트를 사용하면 const_cast<>을 수행해야한다는 것을 알 수 있습니다. 그런 다음 왜 그런지 묻고 더 나은 방법을 찾아야합니다.

관련 문제