Les références en C++ ne sont en fait que des pointeurs restreints, mais il existe des restrictions sémantiques sur le pointeur restreint qui ne peuvent pas être utilisées pour effectuer certaines opérations que les pointeurs peuvent effectuer : réaffectation, copie, ++, -- (je n'y ai pas pensé encore. Autres), et restreindre que null n'est pas autorisé à améliorer la sécurité, ce qui peut être compris comme un mode de protection du compilateur pour les pointeurs.
Alors, réfléchissez à quand devez-vous utiliser des références et quand devez-vous utiliser des pointeurs ? Je pense qu'il y a quelques points :
Citation en premier
Utilisez des références partout où des références peuvent être utilisées à la place des pointeurs.
Les pointeurs peuvent être nuls, mais pas les références.
const stock* top(...)
{
return NULL;
}
Bien sûr, dans ce cas, vous pouvez toujours vous en tenir à l'utilisation de références, et dans le cas d'objets vides, vous pouvez l'exprimer en lançant une exception :
Bien sûr, il y a des exceptions. Si la _car associée doit être variable pendant la durée du voyage, alors vous ne pouvez utiliser que des pointeurs (car les références ne peuvent pas être réaffectées) :
Sinon, si vous insistez pour utiliser des références et souhaitez changer le pointeur de _car, vous ne pourrez reconstruire qu'un nouveau trajet.
Les références ne peuvent pas être enregistrées dans des conteneurs, seuls les pointeurs peuvent être utilisés (je suppose que c'est principalement parce que les références sont limitées dans les opérations de réaffectation et de copie) :
std::vector<car> cars; // OK
std::vector<car*> cars; // OK
std::vector<car&> cars; // ERROR
Enfin, vous pouvez à tout moment convertir la référence en pointeur :
class maintainer
{
public:
void maintain(car& car)
{
car* p = &car;
// play with pointer 'p'
}
};
Mais vous devez faire attention à la situation. Ici, la voiture n'est transmise que pour être utilisée par la méthode de maintenance (la référence implique la relation d'utilisation). Bien que l'opération du pointeur ne soit pas élégante, elle est toujours acceptable, mais vous devez payer. attention à sauvegarder le pointeur pour l'utiliser :
class maintainer
{
car* _last_car;
public:
void maintain(car& car)
{
car* _last_car = &car;
// ...
}
void review_last_maintain()
{
// play with "_last_car"
}
};
Après avoir quitté la méthode maintenir, l'objet pointé par _last_car est susceptible d'être libéré.
Les références en C++ ne sont en fait que des pointeurs restreints, mais il existe des restrictions sémantiques sur le pointeur restreint qui ne peuvent pas être utilisées pour effectuer certaines opérations que les pointeurs peuvent effectuer : réaffectation, copie, ++, -- (je n'y ai pas pensé encore. Autres), et restreindre que null n'est pas autorisé à améliorer la sécurité, ce qui peut être compris comme un mode de protection du compilateur pour les pointeurs.
Alors, réfléchissez à quand devez-vous utiliser des références et quand devez-vous utiliser des pointeurs ? Je pense qu'il y a quelques points :
Citation en premier
Les pointeurs peuvent être nuls, mais pas les références.
Bien sûr, dans ce cas, vous pouvez toujours vous en tenir à l'utilisation de références, et dans le cas d'objets vides, vous pouvez l'exprimer en lançant une exception :
La sémantique de l'usage équitable implique, les pointeurs impliquent la possession (has), les références impliquent l'association (utilisation) :
car
a unwheel
trip
utiliser uncar
:Bien sûr, il y a des exceptions. Si la _car associée doit être variable pendant la durée du voyage, alors vous ne pouvez utiliser que des pointeurs (car les références ne peuvent pas être réaffectées) :
Sinon, si vous insistez pour utiliser des références et souhaitez changer le pointeur de _car, vous ne pourrez reconstruire qu'un nouveau trajet.
Les références ne peuvent pas être enregistrées dans des conteneurs, seuls les pointeurs peuvent être utilisés (je suppose que c'est principalement parce que les références sont limitées dans les opérations de réaffectation et de copie) :
Enfin, vous pouvez à tout moment convertir la référence en pointeur :
Mais vous devez faire attention à la situation. Ici, la voiture n'est transmise que pour être utilisée par la méthode de maintenance (la référence implique la relation d'utilisation). Bien que l'opération du pointeur ne soit pas élégante, elle est toujours acceptable, mais vous devez payer. attention à sauvegarder le pointeur pour l'utiliser :
Après avoir quitté la méthode maintenir, l'objet pointé par _last_car est susceptible d'être libéré.
Const est un gouffre sans fond quand on en parle
Donnez-moi un exemple
Le retour NULL est autorisé pour les pointeurs, mais pas pour les références.