【问题标题】:Allocating an integer to an object. What will be the output?将整数分配给对象。输出会是什么?
【发布时间】:2020-05-07 02:34:13
【问题描述】:
#include <iostream>

using namespace std;
class A{
    public:
  A(){
      cout<<"a";
  }  

  A(int x){
      cout<<"x";
  }  
};

class B: public A{
  public:
  B(A ){
      cout<<"b";
  }  

};
int main()
{
    B b(10);
    return 0;
}

B 的构造函数如何接受整数值? 为什么先调用 A 的参数化构造函数,然后调用默认构造函数?

【问题讨论】:

  • 代码的输出是xab
  • 看看this thread
  • 我看到允许进行一次隐式转换但为什么要调用A的默认构造函数?

标签: c++ object inheritance constructor parameterized


【解决方案1】:

由于B 的构造函数采用A 对象,并且可以从整数构造A 对象,因此编译器将调用A(int) 构造参数以传递给B 的构造函数。这将导致输出“x”。由于 B 的构造函数没有为 A 基类提供初始化器,因此将默认构造基类。这将输出“a”。然后B的构造函数体就会执行,导致输出"b"。

【讨论】:

  • 我理解了第一部分,但我无法理解“由于 B 的构造函数没有为 A 基类提供初始化程序,因此基类将被默认构造”。为什么 B 需要向 A 提供初始化程序?请解释你的观点。谢谢!
  • @Rohitalawadhi 如果您不为成员初始化器列表中的基类提供初始化器,则默认初始化基类子对象。您的 B 构造函数将 A 对象作为参数,但不会将值传递给基类。为此,您需要写 B(A a): A(a) { cout &lt;&lt; "B"; }。当您这样做时,将调用 A 的复制构造函数(不是默认构造函数)。
  • 这意味着对于使用基类对象作为参数的“每个”继承类,派生类需要使用初始化列表传递对象,以便在基类成员中有任何修改,它可以反映正确的更新值,以供进一步的程序运行。我认为这是症结所在?
【解决方案2】:

我不是故意粗鲁,但为了你的代码,不要做这种乱七八糟的事情。

首先,您需要学习如何正确缩进和分隔代码。

    class B: public A
    {
        public:
        B(A )
        {
            cout<<"b";
        }  
    };

当您像这样编写代码时,它变得更具可读性。 (见这篇文章:http://lazyfoo.net/articles/article02/index.php

现在,回答您的问题:

1) 类 B 的构造函数接受一个 A 对象作为参数(你只是忘了命名你的变量 B( A foo ){...} )。

2) 当您将 10 作为参数传递时,您在进程 A foo(10) 或此 A foo = A(10) 中执行此操作。那就是解释第一个x

3) 下面的a 来自A 默认构造函数,b 来自B 构造函数,讽刺的是,第一个被调用的。

【讨论】:

    猜你喜欢
    • 2021-10-06
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2023-03-03
    相关资源
    最近更新 更多