Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 285

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

НапримСр, класс string опрСдСляСт всС ΠΏΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Π° Ρ‚Π°ΠΊΠΆΠ΅ стандартный конструктор. Если объСдинСниС Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ строку ΠΈ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ Π΅Π΅ собствСнный стандартный конструктор ΠΈΠ»ΠΈ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Ρ‚ΠΎ компилятор синтСзируСт эту Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½ΡƒΡŽ. Если Ρƒ класса Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡Π»Π΅Π½ Ρ‚ΠΈΠΏΠ° объСдинСния, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ удалСнная функция-Ρ‡Π»Π΅Π½ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ функция (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ самого класса Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½Π°.

ИспользованиС класса для управлСния Ρ‡Π»Π΅Π½Π°ΠΌΠΈ объСдинСния

Из-Π·Π° слоТностСй создания ΠΈ удалСния Ρ‡Π»Π΅Π½ΠΎΠ² Ρ‚ΠΈΠΏΠ° класса Ρ‚Π°ΠΊΠΈΠ΅ объСдинСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ классС. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, класс ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ состояниСм ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΈΠ· ΠΈ Π² элСмСнт Ρ‚ΠΈΠΏΠ° класса. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² объСдинСниС Ρ‡Π»Π΅Π½ класса string. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ объСдинСниС ΠΊΠ°ΠΊ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ΅ ΠΈ сдСлаСм Π΅Π³ΠΎ Ρ‡Π»Π΅Π½ΠΎΠΌ класса Token. Класс Token Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ объСдинСния.

Для отслСТивания Π²ΠΈΠ΄Π° значСния Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠ³ΠΎ объСдинСниСм ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, дискриминант (discriminant). Дискриминант позволяСт Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ объСдинСниС. Для синхронизации объСдинСния ΠΈ Π΅Π³ΠΎ дискриминанта сдСлаСм дискриминант Ρ‚Π°ΠΊΠΆΠ΅ Ρ‡Π»Π΅Π½ΠΎΠΌ класса Token. Для отслСТивания состояния Ρ‡Π»Π΅Π½Π° объСдинСния класс ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ Ρ‡Π»Π΅Π½ Ρ‚ΠΈΠΏΠ° пСрСчислСния (см. Ρ€Π°Π·Π΄Π΅Π» 19.3).

ЕдинствСнными опрСдСляСмыми классом функциями Π±ΡƒΠ΄ΡƒΡ‚ стандартный конструктор, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ряд ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² присвоСния, способных ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ‚ΠΈΠΏΠΎΠ² объСдинСния Ρ‡Π»Π΅Π½Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ:

class Token {

public:

 // Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρƒ класса

 // Π΅ΡΡ‚ΡŒ объСдинСниС с Ρ‡Π»Π΅Π½ΠΎΠΌ Ρ‚ΠΈΠΏΠ° string

 // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ конструктора пСрСмСщСния ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присваивания ΠΏΡ€ΠΈ

 // ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ остаСтся Π² качСствС ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ упраТнСния

 Token(): tok(INT), ival{0} { }

 Token(const Token &t): tok(t.tok) { copyUnion(t); }

 Token &operator=(const Token&);

 // Ссли объСдинСниС содСрТит строку, Π΅Π΅ придСтся ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ;

 // см. Ρ€Π°Π·Π΄Π΅Π» 19.1.2

 ~Token() { if (tok == STR) sval.~string(); }

 // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присвоСния для установки Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ² объСдинСния

 Token &operator=(const std::string&);

 Token &operator=(char);

 Token &operator=(int);

 Token &operator=(double);

private:

 enum {INT, CHAR, DBL, STR} tok; // дискриминант

 union { // Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ΅ объСдинСниС

  char cval;

  int ival;

  double dval;

  std::string sval;

 }; // Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Token Π΅ΡΡ‚ΡŒ бСзымянный Ρ‡Π»Π΅Π½ Ρ‚ΠΈΠΏΠ° этого

    // бСзымянного объСдинСния

 // ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ дискриминант ΠΈ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π»Π΅Π½ объСдинСния, ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ

 void copyUnion(const Token&);

};

Класс опрСдСляСт Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅, бСзымянноС пСрСчислСниС с Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости (см. Ρ€Π°Π·Π΄Π΅Π» 19.3), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ Ρ‡Π»Π΅Π½Π° tok. Π§Π»Π΅Π½ tok ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ послС Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ„ΠΈΠ³ΡƒΡ€Π½ΠΎΠΉ скобки ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ с запятой, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ пСрСчислСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ опрСдСляСт tok, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ этого бСзымянного пСрСчислСния (см. Ρ€Π°Π·Π΄Π΅Π» 2.6.1).

Π§Π»Π΅Π½ tok Π±ΡƒΠ΄Π΅Ρ‚ использован ΠΊΠ°ΠΊ дискриминант. Когда объСдинСниС содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° int, Ρ‡Π»Π΅Π½ tok Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ INT; Ссли объСдинСниС содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° string, Ρ‚ΠΎ Ρ‡Π»Π΅Π½ tok содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ STR ΠΈ Ρ‚.Π΄.

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ конструктор ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ дискриминант ΠΈ Ρ‡Π»Π΅Π½ объСдинСния ΠΊΠ°ΠΊ содСрТащиС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 Ρ‚ΠΈΠΏΠ° int.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ объСдинСниС содСрТит Ρ‡Π»Π΅Π½, класс ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ дСструктором, слСдуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ собствСнный дСструктор, Ρ‡Ρ‚ΠΎΠ±Ρ‹ (условно) ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Ρ‡Π»Π΅Π½ Ρ‚ΠΈΠΏΠ° string. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ² Ρ‚ΠΈΠΏΠ° класса, Ρ‡Π»Π΅Π½Ρ‹ Ρ‚ΠΈΠΏΠ° класса, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ объСдинСния, Π½Π΅ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ автоматичСски. Π£ дСструктора Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ способа ΡƒΠ·Π½Π°Ρ‚ΡŒ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Ρ…Ρ€Π°Π½ΠΈΡ‚ объСдинСниС. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Ρ‡Π»Π΅Π½ΠΎΠ² слСдуСт ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ дСструктор провСряСт, Π½Π΅ содСрТит Π»ΠΈ удаляСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ строку. Если это Ρ‚Π°ΠΊ, Ρ‚ΠΎ дСструктор явно Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ дСструктор класса string (см. Ρ€Π°Π·Π΄Π΅Π» 19.1.2) для освобоТдСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ памяти. Если объСдинСниС содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ любого ΠΈΠ· встроСнных Ρ‚ΠΈΠΏΠΎΠ², Ρ‚ΠΎ дСструктор Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ дискриминанта ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ строки

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присвоСния ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ tok ΠΈ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‡Π»Π΅Π½ объСдинСния. Подобно дСструктору, эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ условно ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ строку, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ объСдинСнию:

Token &Token::operator=(int i) {

 if (tok == STR) sval.~string(); // Ссли это строка, ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π΅Π΅

 ival = i;  // ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‡Π»Π΅Π½

 tok = INT; // ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ дискриминант

 return *this;

}

Если Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ объСдинСния являСтся строка, Π΅Π΅ слСдуСт ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ объСдинСнию Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ дСструктор класса string.

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π»Π΅Π½ Ρ‚ΠΈΠΏΠ° string освобоТдаСтся, прСдоставлСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ присваиваСтся Ρ‡Π»Π΅Π½Ρƒ, Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ соотвСтствуСт Ρ‚ΠΈΠΏΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int, поэтому ΠΎΠ½ присваиваСтся ival. Π—Π°Ρ‚Π΅ΠΌ обновляСтся дискриминант ΠΈ осущСствляСтся Π²Ρ‹Ρ…ΠΎΠ΄.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присвоСния для Ρ‚ΠΈΠΏΠΎΠ² double ΠΈ char Π²Π΅Π΄ΡƒΡ‚ сСбя, ΠΊΠ°ΠΊ ΠΈ вСрсия для Ρ‚ΠΈΠΏΠ° int, ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ остаСтся Π² качСствС ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ упраТнСния. ВСрсия для Ρ‚ΠΈΠΏΠ° string отличаСтся ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° string ΠΈ ΠΊ Π½Π΅ΠΌΡƒ:

Token &Token::operator=(const std::string &s) {

 if (tok == STR) // Ссли строка ΡƒΠΆΠ΅ содСрТится, просто ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ

  sval = s;

 else

  new(&sval) string(s); // Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ строку

 tok = STR; // ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ дискриминант

 return *this;

}

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС, Ссли объСдинСниС ΡƒΠΆΠ΅ содСрТит строку, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния класса string, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ строкС. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса string для Π²Ρ‹Π·ΠΎΠ²Π° Π΅Π³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присвоСния. ВмСсто этого придСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ строку Π² памяти, которая содСрТит объСдинСниС. Для создания строки Π² области, Π³Π΄Π΅ располагаСтся sval, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new (см. Ρ€Π°Π·Π΄Π΅Π» 19.1.2). Π‘Ρ‚Ρ€ΠΎΠΊΠ° инициализируСтся ΠΊΠΎΠΏΠΈΠ΅ΠΉ строкового ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Π·Π°Ρ‚Π΅ΠΌ обновляСтся дискриминант ΠΈ осущСствляСтся Π²Ρ‹Ρ…ΠΎΠ΄.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ объСдинСния, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅Π΅ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ

Подобно спСцифичСским для Ρ‚ΠΈΠΏΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ присвоСния, конструктор ΠΊΠΎΠΏΠΈΠΉ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присвоСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ дискриминант, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Для выполнСния этих дСйствий ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ copyUnion().

Когда происходит Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ copyUnion() ΠΈΠ· конструктора ΠΊΠΎΠΏΠΈΠΉ, Ρ‡Π»Π΅Π½ объСдинСния Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, означая, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ‡Π»Π΅Π½ объСдинСния. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ строка Π½Π΅ являСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ элСмСнтом, Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ объСдинСниС содСрТит Π½Π΅ строку. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ объСдинСниС ΡƒΠΆΠ΅ содСрТит строку. ΠžΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ этот случай нСпосрСдствСнно Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ присвоСния. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ copyUnion() содСрТит строку, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ строку:

void Token::copyUnion(const Token &t) {

 switch (t.tok) {

 case Token::INT: ival = t.ival; break;

 case Token::CHAR: cval = t.cval; break;

 case Token::DBL: dval = t.dval; break;

 // для копирования строки ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΅Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‰ΠΈΠΉ

 // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new; см. Ρ€Π°Π·Π΄Π΅Π» 19.1.2

 case Token::STR: new(&sval) string(t.sval); break;

 }

}

Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ дискриминанта эта функция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ switch (см. Ρ€Π°Π·Π΄Π΅Π» 5.3.2). ЗначСния встроСнных Ρ‚ΠΈΠΏΠΎΠ² просто ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ‡Π»Π΅Π½Ρƒ; Ссли ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‡Π»Π΅Π½ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ string, ΠΎΠ½ создаСтся.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ возмоТности для Ρ‡Π»Π΅Π½Π° Ρ‚ΠΈΠΏΠ° string: Π»Π΅Π²Ρ‹ΠΉ ΠΈ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ строками; Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² Π½Π΅ являСтся строкой; ΠΎΠ΄ΠΈΠ½, Π½ΠΎ Π½Π΅ ΠΎΠ±Π° ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ строкой:

Token &Token::operator=(const Token &t) {

 // Ссли этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ содСрТит строку, a t Π½Π΅Ρ‚, ΠΏΡ€Π΅ΠΆΠ½ΡŽΡŽ строку слСдуСт

 // ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ