通过Delphi中的const引用

3 delphi delphi-xe2

在XE2中是否存在c ++传递引用到const的Delpi等价物?c ++代码将是:

void passByRef(const MyClass& param);
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 8

void passByRef(const MyClass& param);
Run Code Online (Sandbox Code Playgroud)

const这里说,你不能修改到的引用所引用值.

假设MyClass映射到Delphi类没有任何等价物.在Delphi中,类是引用类型.您可以像这样传递一个const引用:

procedure Foo(const param: TMyClass);
Run Code Online (Sandbox Code Playgroud)

这意味着该函数不允许修改其值param.

param := ...; // this would result in a compilation error
Run Code Online (Sandbox Code Playgroud)

但是允许该方法改变param引用的对象.

param.DataMember := ...; // compiles
param.SomeProperty := ...; // compiles
param.MutateObject(); // compiles
Run Code Online (Sandbox Code Playgroud)

Delphi只是缺少constC++中提供的这方面.

如果您改为映射到记录而不是类,事情会有所不同.那你就得:

procedure Foo(const param: TRecord);
Run Code Online (Sandbox Code Playgroud)

您再次无法分配param,但因为这是一个值类型,您也无法直接修改任何数据成员param.

param.DataMember := ...; // does not compile, for TRecord being a record
Run Code Online (Sandbox Code Playgroud)

但是编译器不会阻止你在这样一个改变内部状态的记录上调用方法.在我看来,这是一种疏忽,但语言设计者很难避免使用他们可以使用的工具.同样,C++的设计在这个领域更加丰富,允许更细粒度的constness规范.

出于这个原因,我强烈建议您不要使用改变记录状态的实例方法来编写记录类型.