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