"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pouvez-vous attribuer à une valeur de type de classe en C ++?

Pouvez-vous attribuer à une valeur de type de classe en C ++?

Publié le 2025-03-24
Parcourir:401

 Can You Assign to an Rvalue of Class Type in C  ?

Affectation à la classe RValues ​​

Présentation

Dans le langage de programmation C, les RValues ​​(valeurs à droite) ne peuvent généralement pas être utilisées comme lvalues ​​(valeurs gauche). Cependant, il existe des exceptions à cette règle, comme illustré par le code suivant:

class Y {
public:
    explicit Y(size_t num = 0) {}
};

int main() {
    Y(1) = Y(0); // WHAT?!?
    return 0;
}

Étonnamment, ce code compile avec succès, même si l'objet renvoyé par le constructeur y (1) est un RValue. Cet article explore les raisons de ce comportement inattendu.

Affectation aux rvalues ​​de type de classe

La clé pour comprendre pourquoi ce code est valide réside dans le concept de fonctions de membres synthétisées. Pour les classes qui ne définissent pas explicitement un opérateur d'affectation, le compilateur génère un opérateur d'attribution par défaut. Cet opérateur par défaut est une fonction de membre qui prend une référence à un objet de la même classe que son paramètre.

Dans l'exemple ci-dessus, l'opérateur d'affectation pour la classe Y est synthétisé comme suit:

Y& Y::operator=(const Y& other);
non. Cela signifie qu'il peut être appliqué à la fois aux LVALUes (objets référencés) et aux RValues ​​(objets non référencés).

Valeurs de retour du constructeur

Lorsqu'un objet est créé à l'aide d'un constructeur qui renvoie un RValue, le compilateur génère un objet temporaire dans la mémoire. Cet objet temporaire est automatiquement détruit à la fin de la déclaration dans laquelle il a été créé. Cependant, dans le cas où le constructeur renvoie une réalité de type de classe, l'opérateur d'attribution synthétisé peut prolonger la durée de vie de l'objet temporaire.

Syntaxe d'attribution

L'instruction d'affectation y (1) = y (0); est un sucre syntaxtique pour le code suivant:

Y(1).operator=(Y(0));
Comme nous l'avons établi, l'opérateur d'attribution d'attribution synthétisé = pour la classe Y est une fonction de membre non-Const, ce qui signifie qu'elle peut être appliquée à un journal. Par conséquent, le compilateur peut interpréter l'instruction Affectation comme une affectation à l'objet temporaire créé par le constructeur y (1).

Conclusion

Contrairement à ce qui est généralement attendu, il est possible d'attribuer à une échelle de type de classe en C car le compilateur synthétise les opérateurs d'attribution non-conforts pour les classes sans explicite sur un opérateur de cession d'explicite. Ces opérateurs d'affectation synthétisés étendent la durée de vie des objets temporaires créés par les constructeurs, permettant aux affectations aux RValues.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3