Конструкторы копии - C++

Есть два основных способа:

  1. Назначить значение переменной внутри файла, но вне определения компонента. Итак, в вашем примере вы сказали бы let info;, а в своем created() хук вы бы пошли this.info = info = await appService.getPosts().

  2. Назначьте сам компонент для переменной перед ее экспортом:

const myComponent = { component definition... }

// Access with myComponent.info

export default myComponent;

Однако! Вы увидите, что myComponent.info изначально undefined. И в отличие от шаблона, значение info не будет реактивно обновляться при разрешении асинхронного вызова. Магия реактивности работает только в шаблоне и в коде фактического компонента, например в computed и watch свойствах. То, как элегантно обрабатывать особенности асинхронной загрузки, действительно зависит от того, как вы хотите использовать эту переменную.

И наконец: причина, по которой вы не просто получаете доступ к переменной в файле .vue, заключается в том, что под капотом шаблон компилируется в функцию, которая выполняется в контексте компонента. Для удобства все поля компонента затем становятся доступными в виде переменных без обычного префикса this. Фактически, в вашем шаблоне info рассматривается как сокращение для this.info. (Обратите внимание, что вы можете заменить this.info на info в шаблоне, и он все равно будет работать.) Эта привилегия не применяется к любому другому коду в файле; это просто ванильный код JS.

10
задан Bill the Lizard 3 November 2011 в 22:09
поделиться

8 ответов

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

1
ответ дан 3 December 2019 в 15:22
поделиться

Да, вы можете написать конструктор, который принимает указатель на объект. Однако его нельзя назвать конструктором копирования. Само определение конструктора копирования требует, чтобы вы передавали объект того же класса. Если вы передаете что-то еще, да, это нормально конструктор, но не конструктор копирования.

19
ответ дан 3 December 2019 в 15:22
поделиться

Вы можете написать конструктор, который принимает указатель в качестве аргумента.
Но конструктор копирования - это имя, которое мы даем конкретному конструктору.
Конструктор, который принимает ссылку (предпочтительно const, но не обязательно) того же класса, что и аргумент, просто называется конструктором копирования, потому что это то, что он делает эффективно.

4
ответ дан 3 December 2019 в 15:22
поделиться

Кроме того факта, что это не будет конструктор копирования, и компилятор сгенерирует конструктор копирования, если вы явно не отключите его Нечего получить и многое потерять. Какова правильная семантика для конструктора из нулевого указателя? Что это добавляет к пользователю вашего класса? (Подсказка: ничего, если она хочет создать объект из кучи, она может просто разыменовать указатель и использовать обычный конструктор копирования).

2
ответ дан 3 December 2019 в 15:22
поделиться

По определению, копирующий ctor использует константную ссылку. Хотя ничто не мешает вам написать ctor, который принимает указатель, он вызывает некоторые проблемы, которые отсутствуют при использовании ссылки - например, что должно / может произойти, если передан нулевой указатель?

1
ответ дан 3 December 2019 в 15:22
поделиться

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

1
ответ дан 3 December 2019 в 15:22
поделиться

Вы можете написать такой конструктор, но технически это не конструктор копирования. Например, контейнеры STL будут по-прежнему использовать сгенерированный компилятором конструктор копирования (компилятор генерирует его, потому что вы его не написали).

1
ответ дан 3 December 2019 в 15:22
поделиться

Конструктор копирования неявно используется в двух случаях:

  • Когда экземпляр вашего класса передается по значению в функция.
  • Когда экземпляр вашего класса возвращается по значению из функции.

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

1
ответ дан 3 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

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