Есть ли в XE2 эквивалент эквивалента dpi C++? Код C++ будет:Передать ссылку на константу в Delphi
void passByRef(const MyClass& param);
Есть ли в XE2 эквивалент эквивалента dpi C++? Код C++ будет:Передать ссылку на константу в Delphi
void passByRef(const MyClass& param);
void passByRef(const MyClass& param);
const
здесь говорит, что вы не можете изменить значение, к которому относится ссылка.
Предполагая, что MyClass
отображается в класс Delphi, нет ничего эквивалентного. В Delphi класс является ссылочным типом. Вы можете передать константную ссылку, как это:
procedure Foo(const param: TMyClass);
Это означает, что функция не может изменить значение param
.
param := ...; // this would result in a compilation error
Но этот метод позволил мутировать объект, к которому относится param
.
param.DataMember := ...; // compiles
param.SomeProperty := ...; // compiles
param.MutateObject(); // compiles
Delphi просто отсутствует этот аспект const
, который доступен в C++.
Если вы вместо этого сопоставлены с записью, а не с классом, все будет немного иначе. Тогда вы должны:
procedure Foo(const param: TRecord);
Опять вы не могли назначить param
, а потому, что это тип значения, вы также защищены от непосредственного изменения каких-либо членов данных param
.
Но компилятор не остановит вас, чтобы вы вызывали методы на такой записи, которые мутируют внутреннее состояние. На мой взгляд, это является чем-то вроде недосмотра, но разработчикам языка нелегко избежать использования имеющихся в распоряжении инструментов. Опять же, дизайн C++ просто богаче в этой области, и допускается более мелкозернистая спецификация константы.
По этой причине я настоятельно рекомендую вам не записывать типы записей с помощью методов экземпляра, которые мутируют состояние записи.