два конструктора по умолчанию, один общедоступный и один закрытый

#c #oop #overloading #access-specifier #constructor-overloading

#c #ооп #перегрузка #спецификатор доступа #конструктор-перегрузка

Вопрос:

Мой вопрос касается конструкторов в ООП (C ). Когда я определяю конструктор по умолчанию в классе как закрытый и когда я инициализирую объект этого класса в main по умолчанию, возникает ошибка, что конструктор по умолчанию недоступен. Все в порядке. Но затем я также создаю конструктор аргументов по умолчанию в общедоступном разделе, и когда я снова инициализирую объект в main, возникает неоднозначный вызов перегрузки функции. Итак, мой вопрос заключается в том, что если частный конструктор недоступен из main, тогда компилятор должен вызвать конструктор в общедоступном разделе, который является конструктором аргументов по умолчанию. Пожалуйста, ответьте, почему это происходит.

Комментарии:

1. Пожалуйста, предоставьте фрагмент кода

Ответ №1:

Разрешено ли какой-либо области вашей программы получать доступ к функциям и / или создавать экземпляры типов классов, определяется компилятором после выполнения разрешения перегрузки. Это означает, что доступные конструкторы не «фильтруются» по их private public видимости или.

В вашем сценарии это может не иметь непосредственного смысла при взгляде на main функцию, из которой вы, похоже, создаете экземпляры объектов рассматриваемого класса. Но представьте, что вы создаете экземпляр класса from с помощью функции-члена этого класса: здесь видны оба private public члена и, и компилятор не сможет решить, какой из них он должен использовать.

В качестве примечания, если вы не хотите, чтобы ваш класс создавался с помощью ctor по умолчанию, отдайте предпочтение = delete ему. Кроме того, конструктор по умолчанию и один с единственным аргументом по умолчанию, безусловно, могут быть преобразованы в два конструктора, например, с использованием инициализаторов в классе.

Ответ №2:

Например, возьмем класс

 #include "iostream"

class Type
{
  private:
    Type()
    {
        std::cout<<"Private Default";
    }
  public:
    Type()
    {
        std::cout<<"Public Default";   
    }
};

int main()
{
    Type obj;
}
  

Здесь оба конструктора по умолчанию находятся в области Type::Type() видимости, которую вы не можете перегрузить подобным образом, т.е. Нет частной или общедоступной области, все они находятся в Type области видимости, поэтому вы не можете перегрузить это в соответствии с правилами перегрузки c .

Вывод для приведенного выше кода:

 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;
};