Чтобы создать объект в C++, конструктор должен называться. Если конструктор, который нужно вызвать, недоступен, его нельзя вызвать, и объект не может быть создан.
Точка private
конструктор не предотвращение объект строительства. Речь идет о контроле, какой код может получить доступ к конструктору и, следовательно, ограничивает, какой код создает объект, являющийся экземпляром этого класса.Конструктор private
доступен для всех функций-членов (static
или иным образом) класса и для всех объявленных классов friend
(которые могут быть отдельными функциями или другими классами) - поэтому любой из них может создать экземпляр класса используя конструктор private
(при условии, что конструктор определен).
Если конструктор не может быть вызван, объект не может быть инициализирован. В конце концов, задача конструктора - инициализировать объект. Но если конструктор недоступен, то объект не может быть построен, поэтому невозможно иметь неинициализированный объект.
Конечно, нет ничего препятствующего тому, чтобы класс имел несколько конструкторов с различными элементами управления доступом (private
, protected
и public
). A class
с конструктором public
может быть построен с использованием этого конструктора любым кодом. Но любая попытка использовать конструктор private
(не-членом не friend
) по-прежнему будет отклонена. Таким образом, управление доступом позволяет (разработчику) class
определенную степень контроля над тем, как создается экземпляр.
Не определяющий (т. Е. Не реализующий) конструктор предотвращает конструкцию объекта. Если этот конструктор равен private
, компилятор отклонит попытку вызвать его (если только функция, пытающаяся создать экземпляр, не является членом или friend
, как указано выше). Для участников и друзей класса компилятор разрешает доступ к конструктору, но (в типичной компиляции компиляции-потом-ссылки) компоновщик не будет создавать исполняемый файл, поскольку он не может разрешить вызов функции, которая не определена , Используя технику маркировки конструктора private
и не определяя его, он является распространенным способом предотвращения создания кода экземпляром класса (путем предотвращения компиляции кода или предотвращения его запуска).
Итак, я понимаю, что отношение между объектом и конструктором заключается в том, что 1) я создаю объект «ClassName obj» 2) это объявление вызывает конструктор классов «ClassName()» 3) этот конструктор выделяет память. и это завершает процесс создания объекта. Если мой объект не может вызвать конструктор, память не будет выделена, и объект не будет создан. Правильно ли я понимаю? - –
Не совсем. Создание объекта с использованием класса ClassName obj; 'вызывает конструктор, который не может принимать никаких аргументов, - который может быть конструктором без фактических аргументов (' ClassName :: ClassName() ') или конструктором со всеми аргументами, имеющими значения по умолчанию (например, объявленные в определение класса как 'ClassName (int x = 0)'). Память для объекта (экземпляр «ClassName») выделяется перед вызовом конструктора, а затем инициализируется конструктором (слабо превращается в объект). Если конструктор недоступен, компилятор не разрешает создание объекта, поэтому код не будет компилироваться. – Peter