XE2中是否存在c ++ pass-by-reference-const-Delpi等价物? c ++代码是:
void passByRef(const MyClass& param);
答案 0 :(得分:8)
void passByRef(const MyClass& param);
此处的const
表示您无法修改引用所引用的值。
假设MyClass
映射到Delphi类,没有任何等价物。在Delphi中,类是引用类型。你可以像这样传递一个const引用:
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只是缺少C ++中提供的const
的这个方面。
如果您改为映射到记录而不是类,事情会有所不同。然后你就有了:
procedure Foo(const param: TRecord);
您再次无法分配给param
,但由于这是一种值类型,因此您也无法直接修改param
的任何数据成员。
param.DataMember := ...; // does not compile, for TRecord being a record
但是编译器不会阻止你在这样一个改变内部状态的记录上调用方法。在我看来,这是一种疏忽,但语言设计者很难避免使用他们可以使用的工具。同样,C ++的设计在这方面更加丰富,允许更细粒度的常量规范。
出于这个原因,我强烈建议您考虑不要使用改变记录状态的实例方法来编写记录类型。