У меня простой вопрос:
class my
{
};
my ob;
Компилятор позволяет мне создавать объект, который имеет смысл. И я знаю, что вы не можете создать объект, где конструктор является закрытым.
Мне кажется, что все внутри класса private
но, очевидно, не конструктор по умолчанию (потому что это позволяет мне создать объект, как конструктор по умолчанию должен быть public
). Но меня смущает то, что нет public
раздел в классе.
Итак, это создает public
раздел только, чтобы поместить конструктор по умолчанию в этом случае?
Или что-то еще происходит, и мое обоснование неверно?
Кроме того, как доступы общедоступные, частные и защищенные внутренне организованы / отслеживаются при создании / доступе к объекту?
Я получил этот вопрос, так как до сих пор никогда не создавал объект пустого класса.
Если вы не объявляете какой-либо конструктор самостоятельно, компиляторы C ++ всегда будут генерировать для вас открытый тривиальный конструктор. Более того, он также неявно создаст открытый конструктор копирования и оператор присваивания.
Из стандарта C ++ 11 12.1.5:
Если
для класса X нет объявленного пользователем конструктора, конструктор без параметров объявляется неявно
по умолчанию. Неявно объявленный конструктор по умолчанию является встроенным открытым членом своего класса.
и 12.8.7, 12.8.11:
Если определение класса не объявляет явно конструктор копирования, он объявляется неявно. […] Неявно объявленный конструктор копирования […] является встроенным открытым членом своего класса.
и, наконец, 12.8.18, 12.8.20, 12.8.22:
Если определение класса явно не объявляет оператор присваивания копии, он объявляется неявно. […] Если определение класса X явно не объявляет оператор присваивания перемещения, он будет неявно
объявлено […]. Неявно объявленный
Оператор копирования / перемещения — встроенный публичный член своего класса.
Обратите внимание, что оператор присваивания перемещения будет сгенерирован только при определенных обстоятельствах, которые выходят за рамки этого вопроса, подробнее см. 12.8.20.
Если вы хотите частный конструктор, вы должны объявить его самостоятельно:
class my { my() {} };
Если вы хотите предотвратить генерацию конструктора копирования или оператора присваивания, вы можете либо объявить, но не реализовать их:
class my { my(my const &); };
Или, начиная с C ++ 11, явно удалите их:
class my { my(my const &) = delete; };
Да, компилятор создаст конструктор по умолчанию, конструктор копирования по умолчанию и операторы присваивания по умолчанию как «public» — потому что все остальное сделало бы класс довольно бесполезным …
Конечно, эти конструкторы были бы довольно просты — на самом деле их можно заменить на «ничто», поскольку создание пустого класса ничего не даст.
Сгенерированный компилятором конструктор по умолчанию (и другие операторы) автоматически становятся открытыми. Если вы хотите, чтобы конструктор по умолчанию был закрытым, вам нужно указать это самостоятельно, объявив его в закрытом разделе вашего класса.
Понятия приватного, защищенного и публичного имеют отношение только к компилятору. Они не имеют смысла и не отслеживаются во время выполнения.
Компилятор сгенерирует конструктор по умолчанию как inline public
если это не определено пользователем, соответствующий раздел C++ draft standard
является 12.1/5
:
Если для класса X нет объявленного пользователем конструктора, конструктор без параметров неявно объявляется как дефолтный (8.4). Неявно объявленный конструктор по умолчанию является встроенным открытым членом своего класса.
Обычно компилятор по умолчанию генерирует 4 вещи в момент создания объекта.
Конструктор по умолчанию
Копировать конструктор
Оператор копирования
Destructor
Например:
class First {
First(){} //default constructor
First(const First &){} //copy constructor
First& operator=(const First&){ //Copy assignment operator
return *this;
}
~First(){} //Destructor
}
Это неявно встроенный открытый член, если только не существует объявленного пользователем конструктора.