2016-06-30 4 views
6

가정하자 나는 다음과 같은 클래스가 있습니다 나중에 나는이 다음이것이 정의 되었습니까?

struct A{ 
    void method(A& otherA) const{ 
    /* Mutate otherA */ 
    } 
}; 

그리고이 : 나는 methodthis 인스턴스를 변경하지 않습니다 컴파일러를 말한

A myA; 
myA.method(myA); 

을하지만, 컴파일러는 것을 깨닫게 않습니다 매개 변수로 this 인스턴스를 전달할 수 있습니까?

내가 이것을 해칠 수 있습니까? 이것은 정의 된 행동입니까?

+0

네, 할 수 있습니다. 컴파일러는 그들이 동일한 인스턴스인지 여부를 알 수 없습니다. 전달 된 매개 변수를 변경하지 않으려면 매개 변수 유형을'const'로 지정해야합니다. – songyuanyao

+0

@songyuanyao 아니 ....하지만 그걸 바꾸고 싶다. – DarthRubik

+0

그러면 괜찮을거야. 전달 된 인수를 통해 변경할 수 있습니다. – songyuanyao

답변

10

이것은 완전히 문제가 없으며 문제가되지 않습니다. 이 예제에서 여러분이하는 일은 두 개의 인수가 실제로 같은 객체를 참조 할 때 "앨리어싱"이라고도합니다.

일반 C에서 더 간단한 경우를 고려

void foo(int* a, const int* b) { *a += *b; } 

int 함수의 두 개의 포인터를 취하고, 첫번째 행의 두번째 추가.

처럼 메서드 내에서 수표를 추가 할이 경우에 그 행동이 마음에 들지 않는다면, 할 수있는 가장 좋은 것은 아마 것

int x = 10; 
foo(&x, &x); // now x is 20 

: 물론이 코드 내 foo 기능이 완벽하게 유효 사용

void A::method(A& otherA) const { 
    if (this == &otherA) { /* aliasing detected */ } 
    else { /* proceed as normal */ } 
} 
+0

내 관심사는 내 프로그램이 "정의되지 않은 동작"에 의존 할 수 있다는 것이었기 때문에 나는 단지 두 번 확인하고 싶었다 ..... 감사합니다. – DarthRubik

관련 문제