문제

나는 왜 Foo 대신 C ++의 이진 연산자로부터 Const Foo를 반환하라는 지시에 대해 조금 혼란스러워합니다.

나는 Bruce Eckel의 "C ++에서의 사고"를 읽고 있었고, 운영자 과부하에 관한 장에서 그는 "오버로드 바이너리 연산자의 반환 가치를 만들어서 Const 회원 기능 만 할 수 있다고 말합니다. 그 반환 값을 요구하십시오. 이것은 const-correct입니다. 이것은 당신이 당신이 잃어 버릴 가능성이 가장 높은 객체에 잠재적으로 귀중한 정보를 저장하지 못하게하기 때문입니다. "

그러나 Const를 반환하는 플러스 연산자와 접두사 증분 연산자가 있으면이 코드는 유효하지 않습니다.

class Integer{
int i;

public:
    Integer(int ii): i(ii){ }
    Integer(Integer&);

    const Integer operator+();
    Integer operator++();
};


int main(){

Integer a(0);
Integer b(1);

Integer c( ++(a + b));
}

이런 종류의 할당을 허용하기 위해 + 연산자가 처음이 아닌 값을 반환하는 것이 합리적이지 않습니까? 이것은 const_cast를 추가하여 수행 할 수 있지만 꽤 부피가 커지지 않습니까?

감사!

도움이 되었습니까?

해결책

++ x라고 말하면 "1을 x에 추가하고 결과를 X에 다시 저장하고 그게 무엇인지 알려주세요"라고 말합니다. 이것은 사전 인증 연산자입니다. 그러나 ++ (A+B)에서 어떻게 "결과를 A+B에 다시 저장해야합니까?"

확실히 당신은 결과를 임시에 다시 저장할 수 있으며, 현재 A+B의 결과를 보유하고있는 임시로 다시 저장할 수 있습니다. 그러나 결과가 어디에 저장되었는지 신경 쓰지 않았다면, 결과를 추가하는 대신 왜 증가 했습니까?

다른 팁

참고, ++(a + b) 포드 (평범한 오래된 데이터 유형, : int). 따라서 자신의 클래스 유형을 허용하지 않는 것이 합리적입니다. 이 시도:

int a = 1;
int b = 2;
int c = ++(a+b);

GCC가 반환됩니다 error: lvalue required as increment operand.

귀하의 경우, 귀하의 사본 생성자를 const Integer 논쟁을하고 당신을 창조하십시오 Integer c 대신 이렇게 :

Integer c(a + b + Integer(1));

복사 생성자는 일반적으로 a Const 참조, 당신을 위해 그 문제를 해결하십시오.

(CONST가 아닌 사본 CTOR가 있으면 자원의 양도가 있음을 의미합니다. 이는 때때로 유용 할 수 있지만 모든 상황의 99%가 필요하지 않습니다)

추가 연산자가 기준을 반환하는 다른 이진 연산자 (예 : 할당 연산자)와 대체 된 경우 OP의 예제가 질문에 적합하다고 생각합니다.

Integer c( ++(a = b));

나는 할당 연산자가 const 또는 끊임없는 참조로 돌아 가게하도록 해야하는지 궁금해했다. 일부 튜토리얼 "C ++의 사고"의 조언과 반대로 비 초가 버전을 사용하십시오. 그리고 다른 참고 문헌 그 뒤에 추론을 제공합니다.

반환 된 참조는 Const로 선언되지 않았습니다. 이것은 당신이 다음과 같은 미친 것들을 쓸 수 있기 때문에 약간 혼란 스러울 수 있습니다.

MyClass A, B, C;

...

(A = B) = C; // 뭐??

언뜻보기에는 연산자 = const 참조를 반환하여 이와 같은 상황을 방지 할 수 있습니다. 그러나 이와 같은 진술은 원시 유형과 함께 작동합니다. 더 나쁜 것은 일부 도구는 실제로이 행동에 의존합니다. 따라서 연산자의 비정규 참조를 반환하는 것이 중요합니다. 경험의 규칙은 "INT에 충분하다면 사용자 정의 데이터 유형에 충분합니다."입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top