两个默认构造函数,一个在公共环境中,一个在私有环境中

问题描述

我的问题是关于OOP(C ++)中的构造函数。当我在一个类中将认构造函数定义为私有时,并且在main中将该类的对象初始化为认对象时,就会发生错误,表明无法访问认构造函数。没关系。但是,然后我还在“公共”部分中设置了认参数构造函数,当我再次在main中初始化对象时,就会发生函数重载的模糊调用。所以我的问题是,如果不能从main访问私有构造函数,则编译器应在public节中调用该构造函数,这是认参数构造函数。请回答为什么会这样。

解决方法

在执行重载解析之后,编译器决定是否允许程序的某些范围访问函数和/或实例化类类型。这意味着可用的构造函数不会被其privatepublic的可见性“过滤”。

在您的情况下,查看main函数可能没有立即的意义,您似乎可以从中实例化所涉及类的对象。但是,想象一下,您使用该类的成员函数从该类的实例创建了一个实例:在这里,privatepublic成员都是可见的,并且编译器将无法决定应该使用哪个成员拿。

请注意,如果您不希望通过默认的ctor创建类,则更喜欢= delete。同样,一个默认的构造函数和一个带有默认的单个参数的构造函数当然可以重构为两个构造函数,例如使用类内初始化程序。

,

例如上课

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