c ++ Initializer list - PullRequest
       6

c ++ Initializer list

0 голосов
/ 06 февраля 2012

У меня вопрос по поводу списка инициализаторов c ++, я где-то вижу следующий код:

class A {
public:
  A(String sender, String receiver, String service) {
                                                        //do something here
                                                    }
}

class B {
public:
  B(String sender, String receiver, String service) {
                                                        //do something here
                                                    }
}

Затем объект создается следующим образом:

A::A(sender,receiver, service) : B(sender,receiver, service) {
//do something here
}

делает B будеттакже будет создан на основе переданных параметров?Как это могло случиться?

1 Ответ

5 голосов
/ 06 февраля 2012

Код, который вы опубликовали, неверен.

Во-первых, чтобы вызвать такой конструктор B, A должен быть получен из B.

Во-вторых, вы предоставляете 2 реализации для A::A.

Я объясню на следующем примере:

class B
{
   int _x;
public:
   B();
   B(int x);
}

B::B()
{
   _x = 42;
}
B::B(int x)
{
   _x = x;
}

class A : public B
{
public:
    A(int x);
};

A::A(int x) : B(x) {}

Теперь, поскольку A is-a B (это и есть наследование), всякий раз, когда вы создаете A, базовый объект - B - также будет создан. Если вы не укажете его в списке инициализатора, будет вызван конструктор по умолчанию для B - B::B(). Даже если вы не заявляете, оно существует.

Если вы укажете другую версию конструктора - как в этом случае, B::B(int), эта версия будет вызвана.

Это просто способ, которым разработан язык.

EDIT:

Я немного отредактировал код.

Предположим следующее определение конструктора A:

A::A(int x) : B(x) {}
//...
A a(10);
//a._x will be 10

Если, однако, ваш конструктор определен как:

A::A(int x) {}
Будет вызван конструктор по умолчанию

B:

A a(10);
//a._x will be 42

Надеюсь, это понятно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...