고정 소수점 계산을 가정 해 봅시다. 일부 산술을 캡슐화하는 클래스가 있습니다. 나는 산술 연산자의 오버로드에 대한 생각을 좋아하므로 다음과 같이 씁니다.C++ 연산자 오버로드 및 암시 적 변환
class CFixed
{
CFixed(int );
CFixed(float);
};
CFixed operator* (const CFixed& a, const CFixed& b)
{ ... }
모두 작동합니다. 3 * CFixed (0) 및 CFixed (3) * 10.0f를 쓸 수 있습니다. 하지만 이제는 정수형 피연산자로 연산자 *를 구현하는 것이 훨씬 더 효과적이라는 것을 알게되었습니다.
CFixed operator* (const CFixed& a, int b)
{ ... }
CFixed operator* (int a, const CFixed& b)
{ ... }
그것은 여전히 작동,하지만 지금 CFixed (0) * 10.0f 호출이 int로 플로트를 변환 버전을 오버로드 (나는 CFixed에 플로트를 변환하는 데 예상) : 그래서 나는 그것을 과부하. 물론 float 버전에도 과부하가 걸릴 수 있지만 코드가 조합 적으로 폭발적으로 증가한 것처럼 보입니다. 어떤 해결 방법이 있습니까 (또는 클래스를 잘못 디자인 했습니까?)? int를 사용하여 연산자의 오버로드 된 버전을 호출하도록 컴파일러에 지시 할 수 있습니까?
반면에 단일 매개 변수 (및 내장 된 매개 변수)를 사용하는 생성자는 물론 명시 적으로 선언되어야하며 이는 물론 승격을 방지하지만 버그를 방지합니다. –
또 다른 "명백한"옹호자 =) 암시 적 생성자는 자신이하는 일을 깨닫는 한 도움이됩니다. 함수를 디자인하고 CFixed 인수를 받아들이고 거기에 정수를 전달하는 것이 좋습니다! – SadSido
나는 너를 믿을 수 없다. – atomice