2016-12-08 3 views

ответ

8
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++ просто богаче в этой области, и допускается более мелкозернистая спецификация константы.

По этой причине я настоятельно рекомендую вам не записывать типы записей с помощью методов экземпляра, которые мутируют состояние записи.

Смежные вопросы