2009-10-20 5 views

Répondre

1

De http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.1

L'idée est d'appeler des fonctions en utilisant la syntaxe des opérateurs C. Ces fonctions peuvent être définies pour accepter paramètres de types définis par l'utilisateur, donnant les opérateurs définies par l'utilisateur signification. Par exemple:

Matrix add(const Matrix& x, const Matrix& y); 
Matrix operator+(const Matrix& x, const Matrix& y); 
Matrix use_add(const Matrix& a, const Matrix& b, const Matrix& c) 
{ 
    return add(a,add(b,c)); 
} 
Matrix use_plus(const Matrix& a, const Matrix& b, const Matrix& c) 
{ 
    return a + b + c; 
} 

En outre, this fil forum de lansinwd traite en détail

+0

Notez que le code fourni ne provient pas de la FAQ C++ actuelle, mais de ce qui semble être une version plus ancienne. (Une raison pour laquelle ils ont probablement changé l'exemple est que 'use_add()' et 'use_plus()' ne sont pas exactement identiques.) – sbi

0

La façon idiomatiques surcharger les opérateurs est la suivante.

struct M { 
    ... 
    M & operator+=(M const& rhs) { 
     loop * 2 to increment 
     return this; 
    } 
}; 

M operator+(M lhs, M const& rhs) { 
    return lhs += rhs; 
} 

Mais un coup d'oeil à Blitz ++, NEWMAT et stimuler des solutions qui éliminent les objets temporaires grâce à Modèles d'expression - C++ références rvalue de solution 0x simplifieront ET. NB: Vous préférerez implémenter op * = en termes d'op * plutôt que l'inverse.

+0

En utilisant 'M operator + (M lhs, M const & rhs) {lhs + = rhs; retournez lhs; } '(en tant que deux lignes au lieu d'une seule ligne) améliore les changements du compilateur de l'optimisation des copies: il est clair que la référence renvoyée est' lhs'. Si vous l'appliquez en tant que doublure, le compilateur ne peut pas deviner si la référence renvoyée par 'lhs + = rhs' est réellement une référence à' lhs' ou à tout autre objet. (Les tests avec g ++ - 4.3.3 -O3 ne montrent aucune différence de toute façon) –

Questions connexes