7

У меня есть простой вопрос:Конструктор по умолчанию пустого класса является общедоступным. Но как?

class my 
{ 
}; 
my ob; 

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

Мне кажется, что все внутри класса private, но явно не конструктор по умолчанию (потому что он позволяет мне создать объект, поскольку конструктор по умолчанию должен быть public). Но меня смущает то, что в классе нет public.

Итак, он создает раздел public только для размещения в нем конструктора по умолчанию?

Или что-то происходит, и мое обоснование неверно?

Кроме того, как осуществляется доступ к публичным, частным и защищенным внутренне организованным/отслеживаемым при создании или доступе объекта?

Я получил этот вопрос, поскольку до сих пор я никогда не создавал объект пустого класса.

+1

Предоставляемые компилятором конструкторы, деструктор и операторы присваивания являются «публичными». Вы должны активно делать вещи, чтобы их запретить. – juanchopanza

ответ

6

Если вы не объявляете конструктор самостоятельно, компиляторы 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; }; 
1

Да, компилятор будет производить конструктор по умолчанию и конструктор копирования по умолчанию и назначения по умолчанию операторов, как «общественность» - потому что все остальное сделает класс довольно бесполезно ...

Конечно, эти конструкторы бы довольно просто - на самом деле его можно заменить на «ничего», так как построение пустого класса ничего не сделает.

1

Созданный компилятором конструктор по умолчанию (и другие операторы) автоматически открыт. Если вы хотите, чтобы конструктор по умолчанию был закрытым, вам нужно указать это самостоятельно, объявив его в частном разделе вашего класса.

Концепции частных, защищенных и публичных относятся только к компилятору. Они не имеют смысла и не отслеживаются во время выполнения.

1

T он компилятор генерирует конструктор по умолчанию, как inline public, если он не определен пользователем, соответствующий раздел C++ draft standard является 12.1/5:

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