J'ai essayé de comprendre les différences entre la conversion de type et le cast de type. Ce que j'ai appris, c'est qu'essentiellement lorsque la valeur sous-jacente ou la représentation binaire d'un type est changée en une autre valeur, nous avons effectué une conversion. Alors que dans un cast de type pur, nous disons simplement au compilateur de traiter le motif binaire comme un autre type. J'ai utilisé 'pur' car un cast peut entraîner une conversion, auquel cas on l'appelle une 'conversion explicite'.
J'ai pensé à deux exemples pour illustrer cette différence. Premier:
float x = 1.5;
float* p1 = &x;
int* p2 = (int*) p1;
int i = *p2;
Ici, caster un type de pointeur n'effectue aucune opération sur la valeur du pointeur. Donc c'est un cast pur. Dans ce cas, cela a entraîné un comportement indéfini car nous obtenons la valeur int en fonction de la représentation binaire de 1,5, 1069547520 pour être précis.
Deuxième:
B* b = new D();
D* d = static_cast(b);
Où D est dérivé de B. Ici, une conversion implicite est faite dans la première ligne. Dans la deuxième ligne également, le cast est en fait une conversion. Ce sont des conversions car la valeur du pointeur peut être modifiée, ajustant la valeur si nécessaire pour pointer vers l'objet D complet ou le sous-objet B (je n'ai pas complètement compris comment les offsets fonctionnent cependant).
Suis-je correct en appelant les casts de pointeur de classes définies par l'utilisateur des conversions ? Si c'est le cas, alors static_cast ci-dessus a également effectué une conversion (explicitement) tandis que cette réponse que j'ai lue appelle les casts un concept totalement différent:
https://stackoverflow.com/a/34268988/1219638 -
Les conversions standard sont des conversions implicites avec des significations intégrées et sont des concepts distincts des choses comme static_cast ou des casts de style C.
Aussi, pourquoi une conversion d'un pointeur de classe définie par l'utilisateur est-elle appelée une conversion standard ?
Puis-je poser une dernière question ? J'ai appris qu'un cast de style C agira comme un static_cast lorsque les types sont liés. Cela signifie-t-il qu'un cast de style C calculera également les offsets s'il le faut ?