C++ 两个构造函数,这是默认值?

C++ 两个构造函数,这是默认值?,c++,class,constructor,C++,Class,Constructor,好吧,我有一个很简单的任务 我为班上的人准备了两个构造器: Person( const string &, const string &, const string & ); Person( const string &, const string &, const string &, const string & ); 我得到了4个默认值 以下哪一项将成为默认构造函数?它总是参数最多的一个还是它是如何工作的?默认构造函数是一个没有参数的

好吧,我有一个很简单的任务

我为班上的人准备了两个构造器:

Person( const string &, const string &, const string & );
Person( const string &, const string &, const string &,
const string & );
我得到了4个默认值


以下哪一项将成为默认构造函数?它总是参数最多的一个还是它是如何工作的?

默认构造函数是一个没有参数的构造函数,或者它有一些参数,但所有参数都提供默认值。在您的例子中,如果两个构造函数的所有参数都具有默认值,则调用

Person p;

将是模棱两可的。想一想:哪一个是被调用的?< / P> < P>根据C++标准

4类X的默认构造函数是 可以在没有参数的情况下调用

从你的帖子中不清楚你在说什么默认值。您的两个声明都不是默认构造函数

如果您正在谈论声明中的默认参数

Person( const string & = "", const string & = "", const string & = "",
const string & = "" );
那么这个声明就是默认构造函数的声明,因为它可以在没有任何显式指定参数的情况下被调用

值得注意的是,同一个构造函数可以同时是默认构造函数和非默认构造函数。至少C++标准没有任何禁止这个的东西。 比如说

struct A
{
   A( int x );
   int x;
};

A a1; // error: there is no default constructor

A::A( int x = 0 ) : x( x ) {}

A a2; // well-formed there is a default constructor.

只有当call语句的签名匹配时,两个构造函数才会匹配。默认构造函数始终是不带参数的构造函数

Person(){}

这两个构造函数都不是默认构造函数

默认构造函数是可以不带参数调用的构造函数,因为

  • 构造函数没有参数,或者
  • 它的所有参数都有默认值

示例中的两个构造函数都要求将参数传递给它们,因此它们都不是默认的;这取决于创建对象的方式

比如,

1-第一个被称为

Person person = new Person("a","b","c");
Person person = new Person("a","b","c","d");
2秒被称为

Person person = new Person("a","b","c");
Person person = new Person("a","b","c","d");

默认构造函数是没有参数的构造函数,或者如果有参数,则所有参数都有默认值。所以这两个函数都不能作为默认构造函数

如果全部为默认值,则不会。那么第一个是不明确的(并且两者都不适用于其中的
new
)。正如我所知,我们可以创建和使用不同的价值观。这不是函数重载原理吗?如果我们在创建对象时指定了一个,则必须调用相关的一个。当然可以,但不能使用问题中所述的OP等所有默认参数(或者我可能错了,因为问题不太清楚)。但是如果这两个参数在声明中都有默认参数呢?是的,这将是一个模棱两可的问题。啊,我明白了,我的老师确实设置了一个有点棘手的问题,他甚至说有50/50%的机会答对。谢谢,我现在可以看到它是如何工作的,因为这个问题不是要求代码审查,而是解释C++特性。我的坏,现在不能删除它。现在看来,如果你说的是真的,并且两者都有默认的参数,它将是含糊不清的。通常,默认构造函数不接受参数。例如,
Person(){}
。我要求版主将其移到堆栈溢出,但这可能需要一些时间。下次提问时请注意,如果有4个默认值,那么最后一个将是默认构造函数?简言之:默认构造函数是一个可以在不传递任何参数的情况下调用的构造函数。