【问题标题】:two default Constructor, one in public and one in private两个默认构造函数,一个是公共的,一个是私有的
【发布时间】:2021-01-10 14:07:10
【问题描述】:
我的问题是关于 OOP(C++) 中的构造函数。当我将类中的默认构造函数定义为私有时,并且当我在 main 中将该类的对象初始化为默认值时,会发生默认构造函数不可访问的错误。没关系。但是随后我还在 Public 部分创建了默认参数构造函数,当我再次在 main 中初始化对象时,就会发生对函数重载的模棱两可的调用。所以我的问题是,如果不能从 main 访问私有构造函数,那么编译器应该在 public 部分调用构造函数,这是默认参数构造函数。请回答为什么会这样。
【问题讨论】:
标签:
c++
oop
overloading
access-specifier
constructor-overloading
【解决方案1】:
是否允许程序的某些范围访问函数和/或实例化类类型由编译器在重载决议执行后决定。这意味着可用的构造函数不会被它们的private 或public 可见性“过滤”。
在您的场景中,在查看 main 函数时,这可能没有立即意义,您似乎从中实例化了相关类的对象。但是假设您使用该类的成员函数创建该类的一个实例:这里,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;
};