La surcharge de l'opérateur new pour une classe
Lorsque nous la surcharge d'opérateur de classe, nous déclarer la fonction comme une fonction membre.
Pour exemple:
class OpNew {
public:
OpNew() { cout << "OpNew::OpNew()" << endl;}
void* operator new(size_t sz) {
cout << "OpNew::new: "
<< sz << " bytes" << endl;
return ::new char[sz];
}
};
Comment la déclaration OpNew *obj = new OpNew
travail sous le capot ? de la surcharge du nouveau, c'est un membre de OpNew classe non statique. Alors, comment ne compilateur assurer cet appel à new
membre de la fonction réussit?
- Il doit être statique.
- J'espère que vous surchargé
operator delete
aussi bien, sinon vous avez un comportement indéfini. - Bien sûr, je l'ai fait, c'était juste un extrait 🙂
- N Fetissov Ce qui devrait être statique? opérateur de nouveau est toujours statique; vous n'avez pas à déclarer statique (et je ne suis même pas sûr que c'est légal de le faire).
- oui,
operator new
etoperator delete
. Ils sont implicitementstatic
. Il est légal de le déclarer explicitement. Qui aurait été nécessaire de l'obtenir-aller pour éviter exactement ce soft de confusion. - Opérateur surchargé nouveau type void*. Comment se fait que dans l'état
OpNew *obj = new OpNew
nous avons obtenu la conversion de void* -> OpNew*? Ces coversions ne peut pas être fait de façon implicite en C++, peuvent-ils? - Le
void*
est consommée par le C++ lui-même, il n'est pas "converti" àT*
. Un objet est créé à l'intérieur de la mémoire (nécessitant un appel du constructeur), et un pointeur vers le nouvel objet est renvoyée au programme. Ne pas confondreT::operator new(sizeof T)
etnew T
- la première est qu'une très petite partie de ce que la seconde implique. - Plus Efficace C++ est la source de la stricte conseils: lorsque vous écrivez un placement version de l'opérateur new, assurez-vous d'écrire les placement version de l'opérateur delete (citant Effective C++, mon accent). Semble que pour seulement surcharger le défaut de mise en place de la nouvelle version de l'opérateur, il n'est pas obligatoire de surcharge de supprimer également. Ce qui a du sens que si vous allez sur les raisons mentionnées à l'Article 52.
Vous devez vous connecter pour publier un commentaire.
Un
operator new()
ouopérateur new[]()
pour une classe est toujours un membre de classe statique, même si elle n'est pas déclarée avec le mot clé static.Ce que le C++ standard dit (projet de n3242), dans la section
[class.free]
: