Использование имени члена класса в конструкторе - PullRequest
2 голосов
/ 13 сентября 2011

Я знаю это, так как это назначит параметр конструктора для члена класса:

class A
{
    public:
        some_type B;
        A(some_type B)
        {
            this->B = B;
        }
}

Но что это будет делать:

class A
{
    public:
        some_type B;
        A(some_type B) : B(B)
        {
        }
}

Будет ли это присваивать параметр себе или параметру члену класса или делать что-то еще?
Как разрешаются имена в списке после конструкции (я не знаю, как она называется)?

Ответы [ 3 ]

9 голосов
/ 13 сентября 2011

То, что называется Список инициализирующих элементов в C ++.

Существует разница между инициализацией элемента с использованием списка инициализаторов (2-й пример) и присвоением ему значения внутри тела конструктора (1-й пример).

Когда вы инициализируете поля через список инициализаторов, конструкторы будут вызываться один раз. Объект получает построенный с переданными параметрами.

Если вы используете присвоение, то поля будут сначала инициализированы конструкторами по умолчанию , а затем переназначены (через оператор присваивания ) с фактическими значениями.

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


Как разрешаются имена в списке после создания объекта (я понятия не имею, как он вызывается)?

public:
    some_type B;
    A(some_type B) : B(B)
    {
    }

В приведенном выше фрагменте есть две сущности с именем B:

  1. Первый - это тот, который конструктор получает в качестве аргумента &
  2. Второй член класса A

Переменная, полученная в качестве аргумента в конструкторе A, передается в качестве аргумента для построения B (путем вызова ее конструктора), который является членом класса A. Здесь нет двусмысленности в именах, все что нужно конструктору:

this->B(B);
  1. this - это указатель class A.
  2. B() является конструктором типа B.
  3. B в скобках - экземпляр типа B.
2 голосов
/ 13 сентября 2011

Будет ли это присваивать параметр себе или параметру классу член или делать что-то еще?

Он назначит параметр члену класса.

Как имена в списке после создания вещи (я понятия не имею, как это называется) разрешено?

Это список инициализаторов, и хотя пример может привести к путанице, идентификатор слева от круглых скобок является членом класса, тогда как идентификатор (или литерал) внутри круглых скобок может быть только одним из параметров конструктора: если так, то двусмысленности нет совсем.

Ключевым моментом здесь является то, что этот список должен инициализировать членов класса с некоторым значением, так что если вы думаете о

...: B(B)

как концептуально эквивалентный вызову конструктора:

this->B(B)

... нет никакой двусмысленности.

0 голосов
/ 13 сентября 2011

В первой ситуации ваш объект будет построен. Во втором он будет построен (с конструктором по умолчанию) и ему будет присвоено.

Возможно, вы не хотите назначения (возможно, оператор не определен, или нет конструктора по умолчанию, или поведение является специфическим, или, возможно, в некоторых случаях из-за проблем с производительностью).

Что касается видимости, в обоих случаях, если вы просто используете B, это параметр, которым вы манипулируете.

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