【问题标题】:Pass by reference to const in Delphi在 Delphi 中通过引用传递 const
【发布时间】:2016-12-08 15:24:07
【问题描述】:

XE2 中是否有 c++ 传递引用到常量 Delpi 等价物? C++ 代码将是:

void passByRef(const MyClass& param);

【问题讨论】:

    标签: delphi delphi-xe2


    【解决方案1】:
    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 规范。

    因此,我强烈建议您考虑不要使用会改变记录状态的实例方法编写记录类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多