【发布时间】:2016-12-08 15:24:07
【问题描述】:
XE2 中是否有 c++ 传递引用到常量 Delpi 等价物? C++ 代码将是:
void passByRef(const MyClass& param);
【问题讨论】:
标签: delphi delphi-xe2
XE2 中是否有 c++ 传递引用到常量 Delpi 等价物? C++ 代码将是:
void passByRef(const MyClass& param);
【问题讨论】:
标签: delphi delphi-xe2
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++ 的设计在这方面更加丰富,允许更细粒度的 constness 规范。
因此,我强烈建议您考虑不要使用会改变记录状态的实例方法编写记录类型。
【讨论】: