2012-01-16 4 views
3

가능한 중복 :
What is the difference between (type)value and type(value)?유형 (변수) 대 변수 (유형)

내가 주로 C#을 개발자입니다 그래서 같은 구문을 사용하여 명시 적 캐스팅을 많이 할 : (type)variable, (int)100.0004d을 예로들 수 있습니다. 따라서 C++로 코드를 작성할 때, 나는 종종 같은 구문을 사용합니다. 그러나 예를 들어 int(100.0004)을 사용하는 구문 type(variable)을 사용하여 동일한 형변환이 수행되는 다른 경우에는 코드를 보았습니다 (심지어 사용했습니다).

두 가지 방법의 차이점과 두 가지 방법의 차이점이 무엇인지에 대해 궁금했습니다.

예 :

double someDouble = 100.00456; 

// Cast the double using the (type)variable syntax 
int firstCastValue = (int)someDouble; 

// Cast the double using the type(variable) syntax 
int secondCastValue = int(someDouble); 
+4

당신은 그 어떤 것보다'static_cast'를 사용한다! –

+0

@GeorgFritzsche 건배 - 나는 질문을 쓰기 전에 그런 기사/SO 포스트를 찾아내는 것을 시도했다. –

+1

그리고 당신은 ... 검색 할 수있는 가장 쉬운 문자가 아닌'('사실에 의해 맞았 :/ –

답변

8

는 동일하며,이 어떤 유형에 대한 사실이다.

개인적으로는 명시 적으로 정적 캐스트에 찬성, 첫 번째 양식, (T)x을 피할 것 :

y = static_cast<T>(x); 

이것은 당신이 에 유형 Tx 변환하려는 표현한다.

두 번째 형태

는 생성자 호출 오히려 더 연상, 그리고 때로는 바람직입니다 :

v = std::vector<int>(10); // not: v = static_cast<std::vector<int>>(10) 

두 형태가 완전히 동일, 반복하려면, 그것을 당신이 선호하는 취향의 문제입니다. 나는 "변환"을위한 정적 형 변환과 "생성 형"을위한 생성자 - 구문을 사용한다.

+0

그래서 Foo' 클래스의 유형 인'콜'푸 (ARG)이'전환 기본 생성자를 다음 호출 할 수는 ? 연산자 – Kos

+3

@Kos :.. 둘 중 하나만 어느'Foo'가 arg' '에서 작도하고, * 또는 *'arg'가 Foo' '로 변환 연산자를 가지고 모두 정의되면 그것은 모호한 –

2

없음. 그들은 정확히 동일합니다. 그러나 이것은 C++이기 때문에 유형간에 C 스타일 캐스트를 사용하지 않아야합니다. static_cast<int>(someDouble)이 당신이 원하는 것입니다.

+1

때 이외에는. 암시 적 변환은 경고없이 가능합니다.'으로 intVar = doublevar'는 경고와 함께 ... '이 분명하기 때문에 이것이 당신이 강제로. –

+1

이 표준 변환이 아닌 어떤 것을으로 intVar = static_cast (doublevar)'보다 더 우아 C 스타일의 캐스트가 작동 할 유일한 곳 (액세스 할 수없는 기본 클래스로의 변환)이 이상한 경우가 있습니다. 또한 캐스팅을 피하는 것이 사용하는 구문보다 훨씬 중요하다는 점을 추가했습니다. fo 당신이 하나를 사용할 때 캐스트. –

+0

@JerryCoffin C++ 캐스트가 작동하지 않는 예제를 줄 수 있습니까? –

1

동일한 작업을 수행합니다. 그러나

  • (int)someDouble는 C++에을 낙담하는 C 스타일의 캐스팅이다. 사용하지 마십시오. 이제까지.
  • int(someDouble) 구문은 캐스트가 아니기 때문에 임시로 생성하라는 명시적인 요청입니다. 하나 이상의 인수를 가진 생성자를 사용하여 임시 생성하고 명시 적 생성자를 사용하여 임시를 생성 할 수 있습니다. 반면에 그것은 하나의 식별자에 의해 이름이 지정되지 않은 유형으로 캐스팅을 허용하지 않습니다 (포인터가 없으므로, unsigned long 등등). 일반적으로 귀하의 의도가 실제적으로 일부 복합어 유형의 일시적 항목을 가질 때, 즉 간단한 생성자가있는 경우에 사용됩니다.
  • static_cast<int>(someDouble) 정말 대부분의 시간을 사용해야합니다. 모든 변환 유형 사이 및 유형의 포인터 사이에서만 변환됩니다. 대부분의 시간에 자신을 제한해야하는 부분입니다.

즉, *_cast 다른 맛이 있습니다

  • dynamic_cast<Something *>(pAnything) 포인터가 실제로 지정된 유형을 가리키는 런타임에 확인하고 그렇지 않은 경우 NULL를 반환합니다. dynamic_cast<Something &>(anything)과 같은 참조에서도 사용할 수 있습니다. 올바른 유형이 아닌 경우 std::bad_cast 예외가 발생합니다. 이것은 C# anything as Something과 같습니다.
  • const_cast<Something *>(constSomething)은 const 한정자 만 제거 할 수 있습니다. 다른 *_cast은 거부합니다. 필요한 경우 디자인 문제가 있습니다.
  • reinterpret_cast<Something *>(pUnrelated)은 관련없는 포인터를 전송합니다. C++에서 포인터 캐스팅은 반드시 사소한 연산 (다중 상속 된 객체에 대한 오프셋을 더하거나 뺄 것)이 아니기 때문에 일반적으로 나쁜 생각이며 영리한 작업을 수행하는 경우에만 사용해야합니다. 사실 나는 "엄격한 앨리어싱 규칙"에 위배되지 않으며 따라서 플랫폼에 종속적 인 reinterpret_cast의 사용이 있는지 확신하지 못합니다. 포인터가 관련이 없을 때 캐스트를 재 해석하는 C 스타일 캐스트가 쇠퇴하는 이유는 절대 사용해서는 안되는 이유입니다.
+0

@JerryCoffin : 다른 캐스트 스타일이 도입 된 모든 이유 때문에 표준에 의해 권장되지 않지만 많은 코딩 지침에 따라 사용되지 않습니다. "낙담 한"말은 아마 더 낫습니다. 편집. –