c++ - 为什么私有(private)构造函数阻止对象创建 C++

标签 c++ private-constructor

我一直读到私有(private)构造函数阻止对象创建。 我在单例模式中使用过它们,我知道如何在使用私有(private)构造函数(使用静态方法等)时创建对象。 我知道构造函数用于对象的初始化。

但我不明白是什么让私有(private)构造函数阻止对象创建。 如果我的对象没有初始化怎么办。我的意思是它应该扔一些垃圾,但为什么要限制??

我已经检查了 stackoverflow 中的所有现有答案,但我没有得到确切的概念。

最佳答案

要在 C++ 中创建对象,需要调用构造函数。如果需要调用的构造函数不可访问,则无法调用,也无法创建对象。

private 构造函数的意义不是阻止 对象构造。它是关于控制哪些代码可以访问构造函数,从而限制哪些代码可以创建作为该类实例的对象。类的所有成员函数(static 或其他)以及类的所有声明的friend 都可以访问private 构造函数(其中可能是单独的函数,或其他类)- 因此其中任何一个都可以使用 private 构造函数(假设已定义构造函数)创建该类的实例。

如果无法调用构造函数,则无法初始化对象。毕竟,构造函数的工作是初始化对象。但是如果构造函数是不可访问的,那么就不能构造对象,所以不可能有未初始化的对象。

当然,没有什么可以阻止该类拥有多个具有不同访问控制(privateprotectedpublic)的构造函数。可以通过任何代码使用该构造函数构造具有public 构造函数的。但是任何尝试使用 private 构造函数(由非成员非friend)仍将被拒绝。因此,访问控制允许的(开发人员)对实例的构造方式进行某种程度的控制。

不定义(即不实现)构造函数确实会阻止对象的构造。如果该构造函数是 private,编译器将拒绝调用它的尝试(除非尝试创建实例的函数是成员或 friend,如上所述)。对于类的成员和 friend ,编译器将允许访问构造函数,但是(在典型的先编译后链接工具链中)链接器不会构建可执行文件,因为它无法解析对未定义函数的调用.使用将构造函数标记为 private 而不是定义它的技术是阻止代码构造类实例的常用方法(通过阻止代码编译或阻止代码运行)。

关于c++ - 为什么私有(private)构造函数阻止对象创建 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41361223/

相关文章:

c++ - 如何在 C++ 中正确向下转换

c++ - C++ 中的 Pimpl 习语和私有(private)构造函数

c++ - 错误的函数值返回

c++ - 静态库中的内联函数被用户项目中的同名函数替换

c++ - 声明构造函数私有(private)和 =delete 有什么区别?

Java Final 类或私有(private)构造函数

c++ - CMake 和 Qt : directory for moc files/clean rules

c++ - MPI_Send(109) : Invalid rank has value -2 but must be nonnegative and less than 1

c++ - 使用 win32 API 或 GDI+ 保存到位图