7.1. Конструктори¶

Усі визначені користувачем типи включають конструктор. Навіть якщо ви не пишете одного явно, компілятор напише його для вас. Для більшості класів і структур, які ми бачили до цього часу, ми дозволяємо компілятору генерувати конструктори за замовчуванням для нас.

конструктора замовчуванням

Конструктор за замовчуванням може бути перевантажений, як і будь-яка інша функція. Під час проектування типів ви можете створювати конструктори з одним, двома або більше аргументами.

Компілятор буде ні згенеруйте конструктор за замовчуванням, якщо ми пишемо будь-які, що не є типовими. Компілятор все ще може створювати інші операції за замовчуванням.

Отже, хоча це добре:

Ми можемо ініціалізувати нашу точку лише за допомогою конструктора за замовчуванням.

Якщо ми хочемо ініціалізувати членів класу під час побудови, тоді нам потрібно додати власні конструктори.

Тепер ми можемо використовувати наш конструктор аргументів 2, але тепер наше старе виклик за замовчуванням порушено. Ви побачите і помилку в такий спосіб:

Це виправляється будь-яким:

Написання власної реалізації за замовчуванням

Запрошення компілятора написати його

Запрошення компілятора видалити його

У цьому випадку спроба використання конструктора за замовчуванням все ще є помилкою компіляції, але помилка є більш явною: ви не можете використовувати її, оскільки її було видалено.

Якщо ви пишете конструктор не за замовчуванням, то вам завжди слід писати власний конструктор за замовчуванням, або явно доручити компілятору зробити його для вас, або видалити його.

Загалом, подбайте про видалення конструктора за замовчуванням. Видаляйте його лише тоді, коли впевнені, що об’єкти класу будуть ніколи потрібно побудувати за замовчуванням.

7.1.1. Синтаксис ініціалізації¶

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

Незважаючи на те, що весь семестр ви писали:

Що стосується визначених користувачем типів, іноді це здається «неповним», якщо ви не включаєте (). Зазвичай ці дужки створюють більше проблем, ніж вирішують. Це пов’язано з невід’ємною неоднозначністю мови С ++. Хоча нам здається очевидним твердження пункт p (); є викликом конструктора за замовчуванням, і результатами має бути нова змінна p, компілятор інтерпретує це по-різному.

Основне правило:

Це означає, що у наведеному вище коді компілятор замість цього шукає:

функція з іменем p

що не бере аргументів

і повертає об'єкт типу point

Оскільки в цьому випадку такої функції немає, вона повертає помилку. Деякі компілятори, як clang, спробують сказати вам:

C ++ вирішує цю неоднозначність у C ++ 11, використовуючи єдиний синтаксис ініціалізатора. Ви можете використовувати фігурні дужки: <> замість дужок для ініціалізації об’єктів. Фігурні дужки - це розширення синтаксису списку ініціалізаторів для контейнерів і може використовуватися навіть для побудованих за замовчуванням об'єктів.