문제

내가 유지 관리하는 프로젝트에서는 간단하게 이와 같은 많은 코드를 봅니다. get/set 행동 양식

const int & MyClass::getFoo() { return m_foo; }

void MyClass::setFoo(const int & foo) { m_foo = foo; }

다음 대신 그렇게하는 요점은 무엇입니까?

int MyClass::getFoo() { return m_foo; }  // Removed 'const' and '&' 

void MyClass::setFoo(const int foo) { m_foo = foo; }  // Removed '&'

원시 유형에 대한 언급을 전달하면 유형의 값 자체를 통과하는 것과 동일 (또는 그 이상) 노력이 필요합니다.
결국 숫자입니다 ...
이것은 단지 일부 미세 최적화 시도입니까, 아니면 진정한 이점이 있습니까?

도움이 되었습니까?

해결책

차이점은 해당 결과를 참조하여 직접 참조하면 기능을 리콜하지 않고 자신의 변수 이름으로 정수 멤버 변수의 변경 사항을 추적 할 수 있다는 것입니다.

const &int x = myObject.getFoo();
cout<<x<<endl;
//...
cout<<x<<endl;//x might have changed

아마도 최선의 디자인 선택이 아니며, 스코프에서 해방되는 변수가 반환되는 경우 참조 (const인지 아닌)를 반환하는 것은 매우 위험합니다. 따라서 참조를 반환하면 범위를 벗어나는 변수가 아닌지 확인하십시오.

수정 자에는 약간의 차이가 있지만, 아마도 할 가치가 있거나 의도 된 것이 아니었을 것입니다.

void test1(int x)
{
  cout<<x<<endl;//prints 1
}

void test2(const int &x)
{
  cout<<x<<endl;//prints 1 or something else possibly, another thread could have changed x
}

int main(int argc, char**argv)
{
  int x = 1;
  test1(x);
  //...
  test2(x);
  return 0;
}

따라서 최종 결과는 매개 변수가 통과 된 후에도 변경 사항을 얻는 것입니다.

다른 팁

나에게 a Const 참조 프리미티브는 실수입니다. 값을 수정해야 하고이 경우에 비 참조, 또는 값에 액세스하기 만하면 Const.

Const 참조 객체를 복사하는 것이 성능 문제가 될 때 복잡한 클래스에만 사용해야합니다. 프리미티브의 경우 변수의 값을 수정할 필요가 없다면 전달해서는 안됩니다. 참조. 그 이유는 그 이유입니다 참조 보다 더 많은 계산 시간을 보냅니다 비 참조, 그 이후로 참조, 프로그램은 테이블을 찾아서 주소 대상의. 이 조회 시간이 복사 시간보다 짧은 경우 참조가 개선됩니다.

일반적으로, ints 그리고 구애 저수준 구현에서 동일한 바이트 길이를 갖습니다. 그래서 복사 시간 int 함수의 반환 값은 복사 시간과 동일합니다. 주소. 그러나 어디에서 int 반환되고, 검토가 수행되지 않으므로 성능이 증가합니다.

값을 반환하는 것과 Const Reference를 반환하는 것의 주요 차이점은 그 다음 참조를 참조하고 값을 변경할 수 있다는 것입니다.

그것은 나쁜 디자인의 예이며 쉽고 간결한 디자인이 충분한 스마트 디자인을 만들려는 시도입니다. 저자는 단지 가치를 반환하는 대신 코드의 독자들이 자신이 가진 의도를 생각하게 만듭니다.

많은 혜택이 없습니다. 나는 이것을 프레임 워크 또는 매크로 생성 된 게터와 세터에서 보았습니다. 매크로 코드는 원시와 비 POD 유형을 구별하지 않았으며 방금 사용했습니다. const type& 세터를 위해 전반적으로. 나는 그것이 효율성 문제 또는 진정한 오해라고 의심합니다. 이것이 일관성 문제 일 가능성이 있습니다.

이 유형의 코드는 참조 개념을 오해하고 원시 데이터 유형을 포함한 모든 것에 사용하는 코드가 작성되었다고 생각합니다. 나는 또한 이와 같은 코드를 보았고 이것을 할 수있는 이점을 볼 수 없습니다.

제외하고는 아무런 요점과 혜택이 없습니다

void MyClass::setFoo(const int foo)
void MyClass::setFoo(const int& foo)

그런 다음 'setfoo'구현 내부의 'foo'변수를 재사용 할 수 없습니다. 그리고 나는 'int &'가 Guy가 Const 참조로 모든 것을 전달하는 데 익숙해지기 때문에 그 문제에 아무런 문제가 없기 때문이라고 생각합니다.

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