C ++ - Есть ли различия между использованием `this` для инициализации члена на уровне класса и` this` в конструкторе?

Весной 4 очень легко вам не нужно вносить какие-либо изменения в фасоль. Отметьте свой тип возврата только @ResponseBody.

Пример: -

@RequestMapping(value = "/image/{id}")
    public @ResponseBody
    byte[] showImage(@PathVariable Integer id) {
                 byte[] b;
        /* Do your logic and return 
               */
        return b;
    }
0
задан Guillaume Racicot 28 February 2019 в 19:40
поделиться

2 ответа

Каковы различия между кодом выше и простой инициализацией C в конструкторе для A?

Это полностью эквивалентно A() : c(b.GetC()) {}. Разницы нет.

Единственное отличие, которое вы заметите, это использование нескольких конструкторов. Он будет использовать инициализатор конструктора вместо стандартного, если он указан.

уровень "объявления", которого еще не должно быть. Но C ++ никогда не перестает удивлять, и приведенный выше код, похоже, работает.

То есть это может существовать на уровне классов в C ++?

Нет. Инициализатор запускается при вызове конструктора. Элемент для инициализации существует только при создании экземпляра.

0
ответ дан Guillaume Racicot 28 February 2019 в 19:40
поделиться

Однако, для меня также имеет смысл, что на уровне класса мы объявляем шаблон, для которого должен копироваться каждый экземпляр класса, и на уровне «объявления» this не должно существовать еще. Но C ++ никогда не перестает удивлять, и приведенный выше код, похоже, работает.

Вы вроде как правы. Если бы у вас было

struct foo
{
    int bar;
    decltype(this->bar) baz;
};

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

В вашем случае, хотя использование this как

C c = this->b.GetC();
//or
C c{this->b.GetC()};

на самом деле не использует this на верхнем уровне. Инициализатор члена класса in является просто синтаксическим сахаром для сообщения классу, что, если вы не инициализируете член вручную, вы должны использовать предоставленный инициализатор. Таким образом, вы на самом деле не используете this в теле класса, вы просто используете ярлык.

Каковы различия между приведенным выше кодом и простой инициализацией C в конструкторе для A?

Преимущество в том, что если у вас есть какое-то значение по умолчанию, чтобы иметь этот член, вам не нужно указывать его во всех созданных вами конструкторах. Вы делаете это один раз, и вы покрыты. Если вам когда-либо понадобится изменить это значение, вы не можете испортить его, потому что есть только одно место, чтобы изменить его. Вы не можете забыть сделать это в определенном конструкторе, который действительно хорош.


Обратите внимание, что есть случай, когда вам нужно использовать this в инициализаторе члена класса. Если элемент, который вы хотите использовать, происходит от зависимого имени, такого как базовый класс шаблона, то вам нужно использовать this, чтобы компилятор разрешил имя.

0
ответ дан NathanOliver 28 February 2019 в 19:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: