конструктор по умолчанию? в проекте N3290 - PullRequest
1 голос
/ 19 сентября 2011

Точка из проекта n3290 §12.1 (Конструкторы) )5:

Неявно объявленный конструктор по умолчанию является членом inline public своего класса. конструктор по умолчанию для класса X определяется как удаленный, если:

  • X является классом типа объединения, в котором есть вариантный член с нетривиальным значением по умолчаниюконструктор,
  • любой нестатический элемент данных без инициализатора скобок или равных имеет ссылочный тип,
  • любой не вариантный нестатический элемент данных типа, определенного константой (илиего массив) без инициализатора скобок или равных не имеет предоставленного пользователем конструктора по умолчанию,
  • X является объединением, и все его вариантные члены имеют тип с определением константы (или его массив),
  • X является классом, не являющимся объединением, и все члены любого анонимного члена объединения имеют квалифицированный константный тип (или его массив),
  • любой прямой или виртуальный базовый класс,или не статический член данных без инициализатора скобок или равенства, имеет тип класса M (или его массив) и либо M не имеет конструктора по умолчанию или разрешения перегрузки (13.3) применительно к Mконструктор по умолчанию приводит кнеоднозначность или в функции, которая удалена или недоступна из конструктора по умолчанию по умолчанию, или
  • любой прямой или виртуальный базовый класс или нестатический член данных имеет тип с деструктором
    , который удален или недоступен изконструктор по умолчанию

Объясните конструктор по умолчанию с примером программы.

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

Я думаю это выдержка из Википедии объясняет это:

Явно дефолтные и удаленные специальные функции-члены

В C ++ 03 для классов, которые не предоставляют самих себя, компилятор предоставляет конструктор по умолчанию, конструктор копирования, оператор присваивания копии (operator =) и деструктор. Программист может переопределить эти значения по умолчанию, определив пользовательские версии. C ++ также определяет несколько глобальных операторов (таких как operator = и operator new), которые работают во всех классах, которые программист может переопределить.

Однако контроль над созданием этих значений по умолчанию очень незначителен. Например, чтобы сделать класс по своей сути не подлежащим копированию, требуется объявить личный конструктор копирования и оператор присваивания копии, а не определять их. Попытка использовать эти функции является нарушением правила одного определения. Хотя диагностическое сообщение не требуется, [5] это обычно приводит к ошибке компоновщика. [Цитата нужна]

В случае конструктора по умолчанию компилятор не будет генерировать конструктор по умолчанию, если класс определен с помощью каких-либо конструкторов. Это полезно во многих случаях, но также полезно иметь возможность иметь как специализированные конструкторы, так и сгенерированные компилятором значения по умолчанию.

C ++ 11 разрешит явное использование по умолчанию и удаление этих специальных функций-членов. Например, следующий тип явно объявляет, что он использует конструктор по умолчанию:

Пример кода:

struct SomeType 
{
    SomeType() = default; //The default constructor is explicitly stated.
    SomeType(OtherType value);
};

Так как вы, похоже, являетесь поклонником Стандерда (почти все ваши Вопросы требуют объяснений по Стандартным Кавычкам), эта статья о том, как комитеты по стандартизации приходят к определению стандартных и удаленных функций, должна быть вам полезна:

Функции по умолчанию и удаленные

0 голосов
/ 19 сентября 2011

Одна из специальных функций-членов «по умолчанию», если она объявлена ​​с синтаксисом = default;.Строка прямо перед первой цитируемой строкой гласит:

Если для класса X нет объявленного пользователем конструктора, конструктор без параметров неявно объявляется как дефолтный (8.4).

Поэтому «дефолтный» конструктор по умолчанию - это конструктор по умолчанию (конструктор, который можно вызывать без аргументов), который объявлен с помощью = default.Это может быть явно определено с использованием синтаксиса = default или неявно определено в приведенной выше строке.

...