Мой вопрос касается конструкторов в ООП (С++). Когда я определяю конструктор по умолчанию в классе как частный и когда я инициализирую объект этого класса в основном по умолчанию, возникает ошибка, что конструктор по умолчанию недоступен. Все хорошо. Но затем я также создаю конструктор аргументов по умолчанию в разделе Public, и когда я снова инициализирую объект в main, возникает неоднозначный вызов перегрузки функции. Итак, мой вопрос заключается в том, что если частный конструктор недоступен из основного, то компилятор должен вызывать конструктор в общедоступном разделе, который является конструктором аргументов по умолчанию. Пожалуйста, ответьте, почему это происходит.
два конструктора по умолчанию, один общедоступный и один частный
Ответы (2)
Например, возьмите класс
#include "iostream"
class Type
{
private:
Type()
{
std::cout<<"Private Default";
}
public:
Type()
{
std::cout<<"Public Default";
}
};
int main()
{
Type obj;
}
Здесь оба конструктора по умолчанию находятся в области Type::Type()
. Вы не можете перегружаться таким образом, т. е. нет частной области или общедоступной области, все они находятся в области Type
. Таким образом, вы не можете перегрузить это в соответствии с правилами перегрузки С++.
Вывод для приведенного выше кода:
main.cpp:11:5: error: ‘Type::Type()’ cannot be overloaded
Type()
^~~~
main.cpp:6:5: error: with ‘Type::Type()’
Type()
^~~~
main.cpp: In function ‘int main()’:
main.cpp:19:10: error: ‘Type::Type()’ is private within this context
Type obj;
^~~
main.cpp:6:5: note: declared private here
Type()
^~~~
И если вам удобно c++11
, вы можете удалить конструктор, например
class Type
{
public:
Type() = delete;
};
Разрешено ли какой-либо области вашей программы обращаться к функциям и/или создавать экземпляры типов классов, решается компилятором после разрешения перегрузки. Это означает, что доступные конструкторы не фильтруются по их private
или public
видимости.
В вашем сценарии это может не иметь непосредственного смысла при просмотре функции main
, из которой вы, кажется, создаете экземпляры объектов рассматриваемого класса. Но представьте, что вы создаете экземпляр класса from с функцией-членом этого класса: здесь видны оба члена private
и public
, и компилятор не сможет решить, какой из них он должен взять.
В качестве примечания: если вы не хотите, чтобы ваш класс создавался ctor по умолчанию, предпочитайте его = delete
. Кроме того, конструктор по умолчанию и конструктор с одним аргументом по умолчанию, безусловно, могут быть реорганизованы в два конструктора, например. используя инициализаторы в классе.