Каковы все функции-члены, созданные компилятором для класса? Это происходит все время?


каковы все функции-члены, созданные компилятором для класса? Это происходит все время? как деструктор. Меня беспокоит, создается ли он для всех классов, и почему необходим конструктор по умолчанию?

4 52

4 ответа:

C++98/03

если они необходимы,

  1. компилятор будет генерировать конструктор по умолчанию для вас, если вы объявите свой конструктор.
  2. компилятор будет генерировать скопироватьконструктор для вас, если вы объявите свой собственный.
  3. компилятор будет генерировать скопироватьоператор присваивания для вас, если вы объявите свой собственный.
  4. компилятор будет генерировать деструктор для вас, если вы объявите свой собственный.

как сказал Петер в полезном комментарии, все они генерируются только компилятором когда они нужны. (Разница в том, что, когда компилятор не может их создать, это нормально, пока они не используются.)


C++11

C++11 добавляет следующие правила, которые также верны для C++14 (кредиты towi, см. комментарий):

  • компилятор генерирует движениеконструктор если
    • нет пользователя-заявил скопироватьконструктор и
    • нет пользователя-заявил скопироватьоператор присваивания и
    • пользователь не объявлен движениеоператор присваивания и
    • нет пользователя-заявил деструктор,
    • это не помечен как удалены,
    • и все члены и базы подвижный.
  • похож на движениеоператор присваивания: он генерируется, если нет пользователя определенный
    • нет пользователя-заявил скопироватьконструктор и
    • нет пользователя-заявил скопироватьоператор присваивания и
    • нет пользователя-заявил движениеконструктор и
    • нет пользователя-заявил деструктор,
    • это не помечено как удалены,
    • и все члены и базы подвижный.

обратите внимание, что эти правила немного более разработаны, чем правила C++03 и имеют больше смысла на практике.

для более легкого понимания того, что такое то, что из вышеперечисленного здесь элементы для Thing:

class Thing {
public:
    Thing();                        // default constructor
    Thing(const Thing&);            // copy c'tor
    Thing& operator=(const Thing&); // copy-assign
    ~Thing();                       // d'tor
    // C++11:
    Thing(Thing&&);                 // move c'tor
    Thing& operator=(Thing&&);      // move-assign
};

и как дальнейшее чтение, Если вы C++-новичок рассмотрим дизайн, который не требует от вас реализации каких-либо из последних пяти, он же Правило Нуля(by Мартиньо Фернандес).

вы имеете в виду "определено" с помощью "создано"?

$12.1 - "конструктор по умолчанию (12.1), конструктор копирования и оператор назначения копирования (12.8) и деструктор (12.4) являются специальными функциями-членами.

Если "создано" означает "определено", то вот важные части из стандарта C++.

-неявно объявленный конструктор по умолчанию для класса неявно определяется, когда он используется для создания объекта типа класса (1.8).

-Если класс не имеет объявленного пользователем деструктора, деструктор объявляется неявно. Неявно объявленный деструктор неявно определяется, когда он используется для уничтожения объекта его типа класса.

-Если определение класса явно не объявляет конструктор копирования, он объявляется неявно. Неявно объявленный конструктор копирования неявно определяется, если он используется для инициализации объекта его типа класса из копии объекта его типа класса или типа класса, производного от его тип класса.)

-Если определение класса явно не объявляет оператор присваивания копии, он объявляется неявно. Неявно объявленный оператор присваивания копии неявно определяется, когда объекту его типа класса присваивается значение его типа класса или значение типа класса, производного от его типа класса.

по умолчанию, если не реализовано пользователем, компилятор добавляет некоторые функции-члены в класс. Это называется "большой четверки":

  • конструктор по умолчанию
  • конструктор копирования
  • скопировать оператора (цессии)
  • деструктор

в зависимости от типов членов и функции-члена, которые вы предоставляете сами, они не будут сгенерированы.

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

меня беспокоит то, будет ли он создан для всех классов...

почему беспокоит? Думая, что это создает нежелательный код в исполняемом файле? Маловероятно,но вы можете легко проверить свою среду.

или, возможно, ваша забота заключалась в том, что он не может создать конструктор, когда вы хотите его? Не о чем беспокоиться... Они всегда создается при необходимости и не предоставляется пользователем.

...и зачем нужен конструктор по умолчанию?

потому что классы могут иметь объекты внутри них со своими собственными деструкторами, которые необходимо систематически вызывать. Например, дано...

struct X
{
    std::string a;
    std::string b;
};

...деструктор по умолчанию гарантирует, что деструкторы для A и b выполняются.