两个默认构造函数,一个在 public 中,一个在私有中

two default Constructor, one in public and one in private

我的问题是关于 OOP(C++) 中的构造函数。当我将 class 中的默认构造函数定义为私有时,当我在 main 中将 class 的对象初始化为默认值时,会发生默认构造函数不可访问的错误。没关系。但是后来我还在 Public 部分创建了默认参数构造函数,当我再次在 main 中初始化对象时,就会发生对函数重载的模糊调用。所以我的问题是,如果无法从 main 访问私有构造函数,那么编译器应该调用 public 部分中的构造函数,这是默认参数构造函数。请回答为什么会这样。

是否允许程序的某些范围访问函数 and/or 实例化 class 类型由编译器决定 after 重载决议已经执行。这意味着可用的构造函数不会被它们的 privatepublic 可见性“过滤”。

在您的场景中,查看 main 函数时可能没有立即意义,您似乎从中实例化了相关 class 的对象。但是想象一下,您使用 class 的成员函数创建了 class 的实例:这里,privatepublic 成员都是可见的,编译器不会能够决定应该采取哪一个。

作为旁注,如果您不希望您的 class 由默认构造函数创建,则更喜欢 = delete 它。此外,默认构造函数和具有默认单个参数的构造函数当然可以重构为两个构造函数,例如使用 in-class 个初始值设定项。

例如 class

#include "iostream"

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

int main()
{
    Type obj;
}

这两个默认构造函数都在范围内 Type::Type() 你不能像这样重载,即没有私有范围或 public 范围都在 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;
};