Operator overloading has changed significantly from Managed Extensions for C++ to Visual C++ 2005.

Perhaps the most striking aspect of Managed Extensions is its support for operator overloading вЂ“ or rather, its effective absence. Within the declaration of a reference type, for example, rather than using the native `operator+`

syntax, one has to explicitly write out the underlying internal name of the operator вЂ“ in this case, `op_Addition`

. More onerous, however, is the fact that the invocation of an operator has to be explicitly invoked through that name, thus precluding the two primary benefits of operator overloading: (a) the intuitive syntax, and (b) the ability to intermix new types with existing types. For example:

В | Copy Code |
---|---|

public __gc __sealed class Vector { public: Vector( double x, double y, double z ); static bool op_Equality( const Vector*, const Vector* ); static Vector* op_Division( const Vector*, double ); static Vector* op_Addition( const Vector*, const Vector* ); static Vector* op_Subtraction( const Vector*, const Vector* ); }; int main() { Vector *pa = new Vector( 0.231, 2.4745, 0.023 ); Vector *pb = new Vector( 1.475, 4.8916, -1.23 ); Vector *pc1 = Vector::op_Addition( pa, pb ); Vector *pc2 = Vector::op_Subtraction( pa, pc1 ); Vector *pc3 = Vector::op_Division( pc1, pc2->x ); if ( Vector::op_Equality( pc1, pc2 )) ; } |

In the new syntax, the usual expectations of a native C++ programmer are restored, both in the declaration and use of the static operators. Here is the `Vector`

class translated into the new syntax:

В | Copy Code |
---|---|

public ref class Vector sealed { public: Vector( double x, double y, double z ); static bool operator ==( const Vector^, const Vector^ ); static Vector^ operator /( const Vector^, double ); static Vector^ operator +( const Vector^, const Vector^ ); static Vector^ operator -( const Vector^, const Vector^ ); }; int main() { Vector^ pa = gcnew Vector( 0.231, 2.4745, 0.023 ); Vector^ pb = gcnew Vector( 1.475,4.8916,-1.23 ); Vector^ pc1 = pa + pb; Vector^ pc2 = pa - pc1; Vector^ pc3 = pc1 / pc2->x; if ( pc1 == pc2 ) ; } |