2016-12-08 24 views

答えて

8
void passByRef(const MyClass& param); 

ここconstあなたは、参照が参照する値を変更することはできませんと言っています。

MyClassがDelphiクラスにマップされていると仮定すると、同等のものはありません。 Delphiでは、クラスは参照型です。これは、関数はparamの値を変更することが許可されていないことを意味し

procedure Foo(const param: TMyClass); 

:あなたはこのようconst参照を渡すことができます。

param := ...; // this would result in a compilation error 

しかし、この方法はparamが参照するオブジェクトを変異させることができます。

param.DataMember := ...; // compiles 
param.SomeProperty := ...; // compiles 
param.MutateObject(); // compiles 

デルファイは、このような側面がC++で利用可能なconstに存在しません。

代わりにクラスではなくレコードにマップされていた場合は、状況は少し異なります。次に、あなたが持っていると思います:

procedure Foo(const param: TRecord); 

をもう一度あなたがparamに割り当てることができませんでしたが、これは値型ですので、あなたも直接paramのいずれかのデータメンバを変更することが防止されます。

param.DataMember := ...; // does not compile, for TRecord being a record 

コンパイラは、内部状態を変更するレコードに対してメソッドを呼び出すのを止めません。これは私の見解では見落としのようなものですが、言語設計者がそのツールを使用しないようにするのは難しいです。繰り返しますが、C++の設計は、この領域ではより豊かであり、細かい粒度指定が可能です。

このため、レコードの状態を変更するインスタンスメソッドを持つレコードタイプを記述しないことを強くお勧めします。

関連する問題