Delphi の暗黙の演算子のように機能する C++ の代入演算子
このセクションでは、C++ の代入演算子を Delphi の暗黙の演算子のように使用するための C++Builder 構文について説明します。
Delphi では、暗黙の演算子が代入にもインスタンス生成にも使用されます。C++Builder の C++ では、operator=
を結果型への代入にのみ使用し、結果型のインスタンス生成には使用しないようにすることができます。
この構文により、Delphi 側で暗黙の演算子が使用されるのと同じように、C++ で operator=
を代入に使用することができます。
このことを明確に示す例は、たとえば、C++ で TValue を使用する場合です。この場合、Delphi には、ユーザーがいくつかの型を透過的に代入できるいくつかの暗黙の演算子があります。
Delphi の場合:
procedure doSomething();
var
a : TValue;
begin
a := 'assigning a string';
a := 123;
a := 3.14;
end;
代入演算子を使用しなければ、上記の Delphi コードと同等の C++ コードは次のようになります。
C++ の場合:
void doSomethingCppOld()
{
TValue a;
a = TValue::_op_Implicit(UnicodeString(L"assigning a string"));
a = TValue::_op_Implicit(123);
a = TValue::_op_Implicit(3.14L);
}
代入演算子を使用すれば、同等の C++ コードを次のように記述することができます。
C++ の場合:
void doSomethingCpp()
{
TValue a;
a = UnicodeString(L"assigning a string");
a = 123;
a = 3.14L;
}
- メモ: 上記のどちらの C++ コードを使用しようと、重要なのは、リテラル文字列を代入する際に
UnicodeString
コンストラクタを呼び出すことです。その型がconst wchar_t *
(L
プレフィックスを付けない場合はconst char *
)になるからです。そうしなければ、ポインタが論理式として評価されることになります。それが最も適合するからです。その結果、おそらく、予期しない暗黙の演算子が呼び出されるでしょう。