다양한 지루한 이유로, int로 주로 작용하는 boxed int 클래스가 필요하지만 객체 계층의 다른 부분과도 작업 할 수 있도록 기본을 상속하는 클래스입니다. int, int 캐스팅을 포함하는 생성자를 포함하여 boxed int와 코드의 일반 int를 쉽게 섞을 수 있습니다. 그러나 나는 알 수없는 매우 이상한 행동을보고 있습니다. 함수에서 boxed int를 반환하면 다른 BoxedInt에 대한 참조를 사용하는 복사 생성자를 사용하고 싶습니다. 그러나 대신 내 boxed int 및 int, 캐스팅하고 내 int 생성자를 사용합니다. 이것은 실제 코드베이스에서이 경우 복사하려는 다른 baseclass 속성이 있고이 캐스트/생성자 경로를 가져 와서 손실되기 때문에 문제가 발생합니다. 여기에 문제의 코드입니다 : 내가 다른 하나 개의 값을 할당 할 때 내가 원하는만큼, 레퍼런스 기반의 생성자가 사용된다 그래서C++에서 반환 값을 int로 변환하도록 선택하는 이유는 무엇입니까?
Start
Constructed with int
Copying
Constructed with reference
Assigning from return value
Constructed with int
Constructed with reference
Cast to int
Constructed with int
Done
:이 실행
class BoxedInt
{
private:
int m_int;
public:
BoxedInt():m_int(0)
{
trace(L"Constructed with nothing");
}
BoxedInt(int val):m_int(val)
{
trace(L"Constructed with int");
}
BoxedInt(BoxedInt& val)
{
trace(L"Constructed with reference");
m_int = val.m_int;
}
operator int()
{
trace(L"Cast to int");
return m_int;
}
};
BoxedInt funky()
{
BoxedInt TempInt = 1;
return TempInt;
}
int main(int argc, char* argv[])
{
trace(L"Start");
BoxedInt test1 = 1;
trace(L"Copying");
BoxedInt test2 = test1;
trace(L"Assigning from return value");
BoxedInt test3 = funky();
trace(L"Done");
return 0;
}
, 여기에 출력의 배고 있다. 그러나, 내 함수의 반환 값을 BoxedInt에 할당하면 컴파일러가 int로 변환하고 int 생성자를 사용하기로 결정합니다. 내 C++은 녹슬었고 나는 이상한 컴파일러 결정의 최하점에 도달하는 데 어려움을 겪고있다. 어떤 아이디어?
명시 적 키워드 http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean에 대한 설명 – fasked
컴파일러는 ** 반환 값을' int', ** ** 그것을 변환합니다. 캐스트는 컴파일러에게 변환을 지시하기 위해 소스 코드에 작성하는 것입니다. 마찬가지로 '연산자 int'는 ** 변환 연산자 **가 아니라 캐스트입니다. –