Выделение целого числа для объекта. Какой будет выход? - PullRequest
0 голосов
/ 21 января 2020
#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, а затем конструктор по умолчанию?

Ответы [ 2 ]

4 голосов
/ 21 января 2020

Поскольку конструктор для B принимает объект A, а объект A может быть построен из целого числа, компилятор вызовет A(int), чтобы создать параметр для передачи конструктору B. Это приведет к выводу «x». Поскольку конструктор B не предоставляет инициализатор для базового класса A, базовый класс будет создан по умолчанию. Это выведет «а». Затем будет выполнено тело конструктора B, в результате чего будет выведено «b».

0 голосов
/ 21 января 2020

Я не хотел быть грубым, но ради вашего кода не делайте такого рода путаницу.

Во-первых, вам нужно научиться правильно делать отступы и пробелы в вашем коде.

    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, по иронии судьбы, первый вызвал.

...