Конструктор за замовчуванням - stack overflow російською
Розгляньте наступну демонстраційну програму
Її висновок на консоль:
Інша важлива відмінність полягає в тому, що один клас має всього лише один конструктор із заданою сигнатурою, а інший клас має три конструктора з різними сигнатурами.
Розгляньте ще один демонстраційний приклад
Тут в класі C ви можете оголосити конструктор за замовчуванням класу B в якості одного класу С. Однак ви не можете зробити те ж саме з конструктором за замовчуванням класу A. щоб оголосити його другом класу C. так як конструктор за замовчуванням в класі A має іншу сигнатуру.
Вам вже доведеться писати
а це може бути не тим, що ви хотіли б отримати. Тобто якщо ви, наприклад, хотіли, щоб одним був конструктор, який викликається виключно без аргументів.
Тобто, знову-таки, коли є окремі конструктори, то ваші можливості ширші.
Якщо розглядати не конструктори, а функції, то різниця є ще більш суттєва.
Аргументи за замовчуванням не впливають на тип функції. Тому, наприклад, якщо ви оголосили функцію як
то, незважаючи на аргумент за замовчуванням і того факту, що ви можете її викликати як
проте її тип void (int, int). А це в свою чергу означає, що ви не можете, наприклад, написати
так як параметр функції h має тип void (int). а у функції, використовуваної в якості аргументу, тип void (int, int)
Якщо ж ви оголосите дві функції замість однієї
то даний виклик
буде коректним, так як є функція з одним параметром.
Відмінності вже пояснив @Vlad from Moscow, я лише запропоную, з двох варіантів в питанні, третій варіант:
На мій погляд саме цей варіант є найкращим, тому що він має явний конструктор з одним аргументом, що є хорошою практикою і вберігає від деяких помилок. З іншого боку, explicit для конструкторів, у яких більше або менше одного аргументу, на мій погляд, є зайвим. Оскільки випадково створити об'єкт з більш ніж одного аргументу проблематично, а саме за цим ми і приписали explicit у одноаргументнова конструктора - захист від випадкових помилок.
Ну і найголовніше, ми маємо лише один конструктор, який ініціалізує поля. Всі інші діють через нього, що дозволяє мінімізувати помилки ініціалізації.
відповідь даний 4 дек '15 в 5:36