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