그래서, 다른 날 시험을했고, 질문 중 하나이 매우 비슷한이었다static_cast 과부하?
우리는 변수 int side
보유 Square
라는 클래스가 있습니다. cout << static_cast<int>(aSquare) <<endl;
이 aSquare 영역을 어떻게 인쇄 할 수 있을까요?
그게 가능합니까?
그래서, 다른 날 시험을했고, 질문 중 하나이 매우 비슷한이었다static_cast 과부하?
우리는 변수 int side
보유 Square
라는 클래스가 있습니다. cout << static_cast<int>(aSquare) <<endl;
이 aSquare 영역을 어떻게 인쇄 할 수 있을까요?
그게 가능합니까?
해당 작업을 수행 할 수는 있지만 오버로드를 통해 수행 할 수는 없습니다. static_cast<>()
. 당신은 타입 캐스트 연산자를 오버로딩하여 수행 :
class Square
{
public:
Square(int side) : side(side) {}
operator int() const { return side * side; } // overloaded typecast operator
private:
int side;
};
// ...
// Compiler calls Square::operator int() to convert aSquare into an int
cout << static_cast<int>(aSquare) <<endl;
가 더 자주 좋은보다 더 많은 피해를 수행하는 경향이보다 그 오버로드 캐스트 연산자를 조심하십시오. 그들은 무의미한 암시 적 캐스트 조작을 가능하게합니다. 아래 코드를 읽으면 "s의 영역을 차지할 것"이라고 생각하십니까?
Square aSquare;
int a = aSquare; // What the heck does this do?
확실히는 아닙니다. 이 방법이 더 의미가 훨씬 더 읽을 수 :
Square aSquare;
int a = aSquare.GetArea();
가 일반적으로 당신이
GetSide()
또는
GetApothem()
또는
GetPerimeter()
이든 같은
Square
에 대한 다른 정보에 액세스 할 수있게하려면 언급 할 필요가 없을 것입니다.
operator int()
은 분명히
int
하나만 반환 할 수 있으며 클래스의 구성원으로 복수
operator int()
을 가질 수 없습니다.
Square
42보다 커야하는
Square s;
if(s > 42) {} // Huh?!
그것은 무엇을 의미 하는가 :
여기에 아직 컴파일 아무런 의미가없는 operator int()
코드를 만드는 또 다른 상황입니까? 말도 안되지만 operator int()
을 사용하면 Shape
이 int
으로 변환 될 수 있습니다. int
의 값은 4
과 비교할 수 있습니다.
이렇게 타입 변환 연산자를 쓰지 마십시오. 실제로 타입 변환 연산자를 오버로드하는 경우 수행중인 작업에 대해 두 번 생각할 수 있습니다. 실제로 타입 변환 연산자의 오버로드가 현대 C++에서 유용 할 경우가 있습니다 (예 : the safe bool idiom).
당신은 광장 클래스의 변환 연산자를 제공 할 수있다 :
struct square {
operator int() const {
return (side * side);
}
int side;
};
유일한 문제는 그것이 암시 적으로 사용됩니다, 그리고 아무튼 캐스팅 :
class Square
{
public:
operator int()
{
return side * side;
}
private:
int side;
};
측면이 아닌 영역을 반환해야합니다. – Dani
매우 작은 사각형의 경우에도 적용됩니다. –
@Dani : 나는 당신이 그 요점을 놓치고 있었다고 생각합니다. 나는 영업 이익이 지역을 계산하는 방법을 알고 있다고 확신합니다. 문제는 기술적 인 부분 인 정사각형 객체로부터 int를 얻는 방법에 정확하게 응답했습니다. –
당신은 캐스트 연산자를 오버로드 할 수 있습니다 여기에 많은 의미가 있습니다. 당신이 캐스트를 사용해야하는 경우
struct square {
int get_area() const {
return (side * side);
}
int side;
}
는, C를 사용 : 당신은 또한 캐스트의 종류 (static_cast, C 스타일 등)
이 일을 할 수있는 좋은 방법입니다 구별 할 수 없습니다 ++ 11 기능을 선택하고 explicit
으로 표시하십시오. 이것은 암시 적 캐스팅 실수를 방지합니다.
+1 : Square 클래스는 몇 가지 더 많은 메소드를 사용할 수 있습니다. 'int GetSideLength() const','int GetPerimeter() const', 그리고'GetArea()'에 명명 된 메소드를 사용해야한다는 것은 모호성을 제거하기위한 것입니다. – rwong
정교한 답변 주셔서 감사합니다. – Radix
@In silico : C++ 11에서는 변환 연산자에 대해 'explicit'키워드를 지원하기 때문에 더 이상 안전한 bool 관용구가 필요하지 않습니다. – smerlin