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 ) ; } |