XE2에서 상응하는 참조로 전달되는 Delphi 델피가 있습니까? 는 C++ 코드는 다음과 같습니다델파이의 const 로의 참조 전달
는void passByRef(const MyClass& param);
XE2에서 상응하는 참조로 전달되는 Delphi 델피가 있습니까? 는 C++ 코드는 다음과 같습니다델파이의 const 로의 참조 전달
는void passByRef(const MyClass& param);
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 사양이 허용됩니다.
이러한 이유로 레코드 유형을 변경하는 인스턴스 메소드로 레코드 유형을 작성하지 않는 것이 좋습니다.