15 Special member functions [special]

15.1 Constructors [class.ctor]

У конструкторов нет имен. В объявлении конструктора declarator- это function declarator форма

ptr-declarator ( parameter-declaration-clause ) noexcept-specifieropt attribute-specifier-seqopt

где ptr-declaratorсостоит исключительно из id-expression, необязательной attribute-specifier-seqи необязательной окружающих скобок, и id-expressionимеет одну из следующих форм:

Не class-nameдолжно быть typedef-name. В объявлении конструктора, каждый decl-specifierв необязательном decl-specifier-seqдолжно бытьfriend,inline, explicitилиconstexpr. [Example:

struct S {
  S();              // declares the constructor
};

S::S() { }          // defines the constructor

end example]

Конструктор используется для инициализации объектов своего типа класса. Поскольку у конструкторов нет имен, они никогда не обнаруживаются при поиске имени; однакоexplicit type conversion using the functional notation вызовет конструктор для инициализации объекта. [ Note: Для инициализации объектов типа класса см[class.init]. ]end note

Конструктор может быть вызван для const, volatile или const volatile объекта. const и volatile семантика ([dcl.type.cv]) не применяются к строящемуся объекту. Они вступают в силу, когда конструктор most derived object заканчивается.

default Конструктор класса X является конструктор класса ,X для которого каждый параметр , который не является параметром функции по умолчанию пакет имеет аргумент в (включая случай конструктора без параметров). Если для класса нет объявленного пользователем конструктора X, неявный конструктор, не имеющий параметров, неявно объявляется как заданный по умолчанию ([dcl.fct.def]). Неявно объявленный конструктор по умолчанию является inline public членом своего класса.

Конструктор по умолчанию для классаX определяется как удаленный, если:

  • X представляет собой объединение, которое имеет вариантный член с нетривиальным конструктором по умолчанию, и ни один вариантный член неX имеет инициализатора члена по умолчанию,

  • X является классом без объединения, который имеет вариантный членM с нетривиальным конструктором по умолчанию, и ни один вариантный член анонимного объединения, содержащий его, неM имеет инициализатора члена по умолчанию,

  • любой нестатический элемент данных без nodefault member initializer относится к ссылочному типу,

  • любой невариантный нестатический член данных типа с квалификацией const (или его массив) без no brace-or-equal-initializerне имеет конструктора по умолчанию, предоставленного пользователем,

  • X является объединением, и все его варианты членов относятся к типу с квалификатором const (или его массиву),

  • X не является классом объединения, и все члены любого анонимного члена объединения относятся к типу с квалификацией const (или его массиву),

  • любой потенциально сконструированный подобъект, за исключением нестатического члена данных с a brace-or-equal-initializer, имеет тип классаM (или его массив) и либоM не имеет конструктора по умолчанию, либоoverload resolution применительно кMсоответствующему конструктору find приводит к неоднозначности или к функции, которая удаляется или недоступен из конструктора по умолчанию, или

  • любой потенциально созданный подобъект имеет тип с деструктором, который удален или недоступен из конструктора по умолчанию по умолчанию.

Конструктор по умолчанию - trivial это если он не предоставлен пользователем и если:

  • у его класса нетvirtual functions и нетvirtual base classes, и

  • ни один нестатический член данных его класса не имеетdefault member initializer, и

  • все прямые базовые классы этого класса имеют тривиальные конструкторы по умолчанию, и

  • для всех нестатических членов данных своего класса, которые относятся к типу класса (или его массиву), каждый такой класс имеет тривиальный конструктор по умолчанию.

В противном случае конструктором по умолчанию является non-trivial.

Конструктор по умолчанию, который установлен по умолчанию и не определен как удаленный, - implicitly defined это когда онodr-used должен создать объект своего типа класса ([intro.object]) или когда он явно используется по умолчанию после его первого объявления. Неявно определенный конструктор по умолчанию выполняет набор инициализаций класса, которые были бы выполнены написанным пользователем конструктором по умолчанию для этого класса с no ctor-initializerи пустым compound-statement. Если этот пользовательский конструктор по умолчанию будет иметь неправильный формат, значит, программа будет иметь неправильный формат. Если этот написанный пользователем конструктор по умолчанию будет удовлетворять требованиям aconstexpr constructor, то неявно определенный конструктор по умолчанию будетconstexpr. Прежде чем конструктор по умолчанию по умолчанию для класса будет неявно определен, все не предоставленные пользователем конструкторы по умолчанию для его базовых классов и его нестатические элементы данных должны быть неявно определены. [ Note: Неявно объявленный конструктор по умолчанию имеет спецификацию исключения ([except.spec]). Явно заданное по умолчанию определение может иметь неявную спецификацию исключения, см[dcl.fct.def]. ]end note

Конструкторы по умолчанию вызывается неявно создавать объекты класса статики, нити или автоматическую продолжительность хранения ([basic.stc.static],[basic.stc.thread],[basic.stc.auto]) , определенной безinitializer, призвано создавать объекты классовых ,dynamic storage duration созданные new-expression в котором new-initializer опущено ([expr.new]), или вызываются , когдаexplicit type conversion синтаксис используется. Программа плохо сформирована, если конструктор по умолчанию для объекта неявно используется, а конструктор - нетaccessible.

[ описывает порядок, в котором вызываются конструкторы для базовых классов и нестатических членов данных, и описывает, как можно указать аргументы для вызовов этих конструкторов. ]Note: [class.base.init] end note

return Оператор в теле конструктора не должен указать возвращаемое значение. Адрес конструктора не принимается.

Afunctional notation type conversion можно использовать для создания новых объектов своего типа. [ Note: Синтаксис выглядит как явный вызов конструктора. ] [end noteExample:

complex zz = complex(1,2.3);
cprint( complex(7.8,1.2) );

end example]

Созданный таким образом объект не имеет имени. [ Note: [class.temporary] описывает время жизни временных объектов. ] [ Явные вызовы конструкторов не дают значений l, см . ]end noteNote: [basic.lval]end note

[ Некоторые языковые конструкции имеют особую семантику при использовании во время построения; видеть и . ]Note: [class.base.init] [class.cdtor]end note

Если во время конструирования объекта доступ к значению объекта или любого из его подобъектов осуществляется через значение glvalue, которое не получено, прямо или косвенно, изthis указателя конструктора , значение полученного таким образом объекта или подобъекта не указывается. [Example:

struct C;
void no_opt(C*);

struct C {
  int c;
  C() : c(0) { no_opt(this); }
};

const C cobj;

void no_opt(C* cptr) {
  int i = cobj.c * 100;         // value of cobj.c is unspecified
  cptr->c = 1;
  cout << cobj.c * 100          // value of cobj.c is unspecified
       << '\n';
}

extern struct D d;
struct D {
  D(int a) : a(a), b(d.a) {}
  int a, b;
};
D d = D(1);                     // value of d.b is unspecified

end example]