【问题标题】:Two constructors, which is default?两个构造函数,哪个是默认的?
【发布时间】:2014-03-10 13:23:51
【问题描述】:

好的,我有一个非常简单的任务。

我得到了 Person 类的这两个构造函数:

Person( const string &, const string &, const string & );
Person( const string &, const string &, const string &,
const string & );

我有 4 个默认值

其中哪些将成为默认构造函数?它总是争论最多的那个还是它是如何工作的?

【问题讨论】:

  • 这属于Stack Overflow,因为这个问题不是要求审查代码,而是要求解释 C++ 功能。
  • 我的错,现在好像删不掉了
  • 如果你说的是真的,并且两者都有所有默认参数,那将是模棱两可的。
  • 两者都不是。通常,默认构造函数不带任何参数。例如,Person() {}.
  • 我请版主将其移至 Stack Overflow,但这可能需要一些时间。下次提问时请注意what this site is for

标签: c++ class constructor


【解决方案1】:

根据 C++ 标准

4 类 X 的默认构造函数是类 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.

【讨论】:

  • 但是如果两者在声明中都有默认参数怎么办?那会不会模棱两可?
  • @Sumsar1812 是的,它会模棱两可。
  • 啊,我明白了,我的老师确实设置了这个问题有点棘手,他甚至说有 50/50% 的机会做对了这个问题 ;)。谢谢,我现在可以看到它是如何工作的
【解决方案2】:

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

默认构造函数是一个可以不带参数调用的构造函数——要么是因为

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

您示例中的两个构造函数都要求将参数传递给它们,因此它们都不是默认构造函数。

【讨论】:

    【解决方案3】:

    默认构造函数是一个没有参数的构造函数,或者它有一些参数,但它们都提供了默认值。在您的情况下,如果您的两个构造函数的所有参数都具有默认值,那么像

    这样的调用
    Person p;
    

    将是模棱两可的。想一想:要调用哪一个?

    【讨论】:

      【解决方案4】:

      默认构造函数是没有参数的构造函数,或者如果它有参数,则所有参数都有默认值。因此,其中任何一个都不能成为默认构造函数。

      【讨论】:

      • 那么如果有4个默认值,那么最后一个就是默认构造函数?
      • 简而言之:默认构造函数是可以在不传递任何参数的情况下调用的构造函数。
      【解决方案5】:

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

      Person(){}
      

      【讨论】:

        【解决方案6】:

        如果你问哪个可以调用;这取决于你如何创建对象。

        例如;

        1 - 首先被调用

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

        2 - 秒被调用

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

        【讨论】:

        • 如果全部默认,则不是。然后第一个是模棱两可的(并且两者都不适用于那里的new)。
        • 我们不能创建两个或更多的构造函数吗?据我所知,我们可以创建并使用不同的值。不就是函数重载原理吗?如果我们在创建对象时指定了一个,则必须调用相关的。
        • 是的,当然,但不是所有默认参数,如问题中所述的 OP(或者我可能错了,因为问题不是太清楚)。
        猜你喜欢
        • 2021-01-10
        • 2014-05-19
        • 1970-01-01
        • 2017-05-04
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 2012-06-30
        • 2016-07-23
        相关资源
        最近更新 更多