Введення / висновок C + +

Перевантаження операторів

Одна з переваг мови можливість створювати нові типи даних (класи), які можуть використовуватися інтуїтивно Наприклад, математик, що працює з числами нового виду, міг б створити клас для зберігання таких чисел і перевизначити оператори + і *, щоб міг використовувати звичайну арифметичну запис

C + + дозволяє перевизначати базові оператори B дійсності вираз, подібне а + b, перетвориться в аoperator + (b) (або в operator + (a, b), залежно від контексту) Визначаючи (або перевизначаючи) функцію-член

operator +, ви здатні змінювати спосіб складання (Проте не можете затрагі-

вать існуючі оператори або додавати нові)

Дана перевага небезпечно, і вам не слід часто їм користуватися Легко створити неудобочітаемимі програми, перевизначаючи базові оператори Я враховую це при програмуванні а тут розповідаю про нього тому, що стандартна бібліотека C + + перевизначає деякі оператори

Введення / висновок

Стандартна бібліотека C + + перевизначає оператори << і >> При сусідстві з числами вони все ще означають «зсув вліво» і «зсув вправо» Однак якщо лівий операнд є потоковим класом (Stream class), вони реалізують введення / висновок Наприклад, запис cout << "Hello \ n" посилає рядок "Hello \ n" в потік cout. (Cout це потік C + +, еквівалентний декріптор файлу stdout в C). Зауважимо, що даний механізм є тіпонезавісімим (type-safe), компілятор вибирає потрібне визначення operator << залежно від типів. B противагу цьому, оператор printf мови C очікує, що ви надасте специфікатор формату, відповідний використовуваним вами типам.

Існує чотири стандартних потоку введення / виводу, імена яких cout, cin, cerr і clog Перші три відповідають дескрипторах stdout, stdin і stderr мови C зручно використовувати, якщо форматування вихідний інформації неважливо Ви навіть можете застосовувати декілька операторів << і >> цілком очевидним способом:

cout << "Мінлива i має значення:" << i << "\ N";

Однак я волію в більшості випадків для форматування вихід-

ної інформації використовувати printf, характерний для C

Додатки

Перетворення типів в C + +

Перетворення типів досить поширені в програмуванні на C Хоча й не так часто, вони все ще потрібні в C + + Стандартна запис C виду (int) var, на жаль, не надто ясна, так як вона не визначає причини приведення

Точно визначаючи мету приведення, компілятор може допомогти вам перевірити код Для полегшення виявлення помилок і більш легкого орієнтування в програмному коді C + + надає нову форму запису, яка визначає мету приведення типів:

 ‰  reinterpret_cast <Ñ, Ð ¸ Ð ¿> (Ð ² Ñ <Ñ € Ð ° Ð ¶ ÐμÐ ½ Ð ¸ Ðμ). ÐŸÑ € Ð ¸ Ð ¸ Ñ Ð ¿Ð ¾ Ð »ÑŒÐ · Ð ¾ Ð ² Ð ° Ð ½ Ð ¸ Ð ¸ Ñ Ñ, Ð ¾ Ð ¹  Р· Ð ° Ð ¿Ð ¸ Ñ Ð ¸  Ñ, Ðμ  Р¶ Ðμ  Р± Ð ¸ Ñ, Ñ ​​< Ð'Ð ° Ð ½ Ð ½ Ñ <Ñ ...  Ñ, Ñ € Ð ° Ð º Ñ, уюÑ, Ñ Ñ Â Ð º Ð ° Ð º  Р¿Ñ € ÐμÐ'Ñ Ñ, Ð ° Ð ² Ð ¸ Ñ, ÐμÐ »Ð ¸  Р½ Ð ¾ Ð ² Ð ¾ Ð ³ Ð ¾  Ñ, Ð ¸ Ð ¿Ð °.   ОР½ Ð ° Ð ¿Ñ € Ð ¸ Ð ¼ ÐμÐ ½ Ñ ÐμÑ, Ñ Ñ,  Р²  Р¾ Ñ Ð ½ Ð ¾ Ð ² Ð ½ Ð ¾ Ð ¼,  Ð'Ð »Ñ  Р¿Ñ € Ð ¸ Ð ² ÐμÐ'ÐμÐ ½ Ð ¸ Ñ Â Ñ, Ð ¸ Ð ¿Ð °  уРº Ð ° Ð · Ð ° Ñ, ÐμÐ »ÐμÐ ¹, наприклад, так: reinterpret_cast (buffer)

 ‰   static_cast <Ñ, Ð ¸ Ð ¿> (Ð ² Ñ <Ñ € Ð ° Ð ¶ ÐμÐ ½ Ð ¸ Ðμ). ÐÑ, Ð ° Ð · Ð ° Ð ¿Ð ¸ Ñ ÑŒ Ð · Ð ° Ñ Ñ, Ð ° Ð ² Ð »Ñ ÐμÑ, Ð º Ð ¾ Ð ¼ Ð ¿Ð ¸ л Ñ Ñ, Ð ¾ Ñ € Ð ¾ Ñ Ñƒ-

ществить стандартне перетворення, таке як static_cast

(sin(x))

 ‰  const_cast <Ñ, Ð ¸ Ð ¿> (Ð ² Ñ <Ñ € Ð ° Ð ¶ ÐμÐ ½ Ð ¸ Ðμ). ПР¾ Ð'Ð ¾ Ð ± Ð ½ Ð ° Ñ Ð · Ð ° Ð ¿Ð ¸ Ñ ÑŒ Ð ¸ Ð · Ð ¼ ÐμÐ ½ Ñ ÐμÑ, Ð ¿Ñ € Ð ¸ Ð ½ Ð ° Ð'Ð »ÐμÐ ¶ -

ність вираження до типів const або volatile Зауважимо, що це єдиний-

ственная нова можливість приведення, яка може використовуватися

в подібних цілях

 ‰   dynamic_cast <Ñ, Ð ¸ Ð ¿> (Ð ² Ñ <Ñ € Ð ° Ð ¶ ÐμÐ ½ Ð ¸ Ðμ). Ð "Ð ° Ð ½ Ð ½ Ð ° Ñ Ð · Ð ° Ð ¿Ð ¸ Ñ ÑŒ Ð ¿Ñ € ÐμÐ ¾ Ð ± Ñ € Ð ° Ð · уÐμÑ, уРº Ð ° Ð · Ð ° Ñ, Ðμл ÑŒ

на обєкт в покажчик на сумісний обєкт Коректність цього перетворень-

тання динамічно перевіряється під час виконання Це найменш рас-

пространения з нових форм записів приведення

Посилання

C + + створює альтернативу вказівниками C у багатьох випадках більш безпечну і просту Оголошення, подібне int & i, робить i посиланням (Reference) на ціле значення Внутрішньо посилання обробляється так само, як і покажчик Приносить вигоду передача великих обєктів у функцію з використанням посилань

Проте посилання це не покажчики Посилання використовує відмінний від покажчиків синтаксис Ви застосовуєте для посилання на елемент класу або структури оператор «точка» (), А не оператор «стрілка» (->) Посилальна змінна повинна бути проініціалізувати при своєму створенні Неможлива посилання, що містить значення NULL, так само як і неможливо змінити значення посилання

Зауважимо, що використання оператора & для оголошення посилання не вступа-

ет в протиріччя з використанням & в якості оператора взяття адреси

Я рідко використовую посилання, але вони необхідні для певних системних класів

Оператор this

Коли ви викликаєте функцію-член через запис objectFoo (a, b), компілятор перетворює її в запис Foo (& object, a, b) Аналогічно, якщо ви визначаєте функцію-член Foo () у класі, на насправді використовується запис Foo (class * this) Кожна функція-член (за винятком методів класу, описаних зі специфікатором static, які я не збираюся розглядати) має спеціальну змінну з імям this вказівник на поточний обєкт Усередині функції-члена ви можете викликати інші функції-члени або у формі Bar (), або у формі this-> Bar () Оператор this рідко використовується явно Однак він корисний, коли якого-небудь обєкту необхідно передати іншому обєкту покажчик на себе (Як у SampledInstrument :: NewNote, глава 21 Обєкт SampledInstrument передає SampledNote покажчик на себе для того, щоб нотний обєкт отримав доступ до загальних даних, збереженим в інструментном обєкті)

Друзі

Відповідне використання специфікаторів private і public може значно спростити життя Накладаючи обмеження на експлуатацію вашого класу іншими людьми, ви можете спростити майбутнє зміна реалізації Однак існує один виняток Припустимо, у вас є два сильно повязаних класу, причому кожен з них повинен мати доступ до приватних даними

іншого, або спеціальна функція, що потребує доступу до даних класу, кото-

рие, в свою чергу, необхідно зробити приватними

Визначаючи функцію або клас як дружню (специфікатор friend), ви змушуєте компілятор спеціально дозволити функції або класу доступ до приватних даних Наприклад, у класі глави 6 мені знадобилося створити функцію, яка не будучи членом класу (щоб я міг передати покажчик на цю функцію системним аудіоутілітам), мала б доступ до приватних даних класу Аналогічно в розділі 21 мені необхідно було зробити так, щоб обєкт SampledNote міг звертатися до поділюваного нотної інформації, що зберігається в асоційованому обєкті SampledInstrument

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = A Programmers Guide to Sound: Пер з англ М: ДМК Пресс, 2000 432 с, іл (Серія «Для програмістів»)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*