2016-12-08 3 views

답변

8
void passByRef(const MyClass& param); 

여기 const 당신이 참조가 참조하는 값을 수정할 수 있다고 말한다.

MyClass이 델파이 클래스에 매핑된다고 가정하면 동등한 요소는 없습니다. Delphi에서 클래스는 참조 유형입니다.

procedure Foo(const param: TMyClass); 

이 함수는 param의 값을 수정하도록 허용되지 않음을 의미합니다 :이 같은 const를 참조를 전달할 수 있습니다.

param := ...; // this would result in a compilation error 

하지만 방법 param 참조 처 오브젝트를 돌연변이시킨다.

param.DataMember := ...; // compiles 
param.SomeProperty := ...; // compiles 
param.MutateObject(); // compiles 

델파이 단순히 C++에서 사용할 const의이 양태가 없습니다.

대신 클래스가 아닌 레코드에 매핑하면 상황이 약간 달라집니다. 그런 다음 당신은 것입니다 :

procedure Foo(const param: TRecord); 

은 다시 당신은 param에 할당 할 수 있지만,이 값 형식이기 때문에, 당신은 또한 직접 param의 데이터 멤버를 수정하는 것을 방지한다.

param.DataMember := ...; // does not compile, for TRecord being a record 

그러나 컴파일러는 내부 상태를 변경하는 레코드에서 메소드를 호출하는 것을 중단하지 않습니다. 이것은 내 견해로는 감독의 대상이지만 언어 디자이너가 도구를 사용하지 않도록하는 것은 어렵습니다. 다시 말하지만, C++의 디자인은이 영역에서보다 풍부하고 세밀한 constness 사양이 허용됩니다.

이러한 이유로 레코드 유형을 변경하는 인스턴스 메소드로 레코드 유형을 작성하지 않는 것이 좋습니다.