Почему константа аргумента конструктора копии?

Использовать условие Существует в задании копирования.

<CreateItem Include="*.xml">
  <Output ItemName="ItemsThatNeedToBeCopied" TaskParameter="Include"/>
</CreateItem>

<Copy SourceFiles="@(ItemsThatNeedToBeCopied)"
      DestinationFolder="$(OutputDir)"
      Condition="Exists('%(RootDir)%(Directory)%(Filename)%(Extension)')"/>
28
задан Rob Kennedy 21 October 2009 в 18:32
поделиться

7 ответов

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

Более важно Однако временный объект не может привязаться к неконстантной ссылке. Копирующий ctor должен принимать ссылку на константный объект, чтобы иметь возможность делать копии временных объектов.

57
ответ дан 28 November 2019 в 02:32
поделиться

Поскольку вы не собираетесь изменять аргумент other внутри объекта копирования, поскольку он является const.

Когда вы сделали x = other.x по сути означает this-> x = other.x . Таким образом, вы изменяете только этот объект, просто копируя значения из другой переменной. Поскольку другая переменная здесь доступна только для чтения, она передается как const-ref.

20
ответ дан 28 November 2019 в 02:32
поделиться

Традиционный copy-ctor и его друзья принимают параметр const & по причинам, указанным выше. Однако вам также следует поискать move-semantics и ссылки на r-значение (чтобы быть частью C ++ 0x, если все пойдет хорошо), чтобы узнать, почему и когда вы будете использовать copy-ctors без параметра const и .

3
ответ дан 28 November 2019 в 02:32
поделиться

Its not specific to copy constructor. In any function if you are not going to modify the internal state of the object then object will be passed as const.

Vector(const Vector& other) 
{
     //Since other is const, only public data member and public methods which are `const` can be accessed.
}
0
ответ дан 28 November 2019 в 02:32
поделиться

Чтобы не мог изменить другое (случайно)?

1
ответ дан 28 November 2019 в 02:32
поделиться

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

0
ответ дан 28 November 2019 в 02:32
поделиться

Это также может пригодиться, если вы хотите скопировать объект, на который у вас есть только константная ссылка, например,

...
const Vector& getPosition();
...

Vector* v = new Vector(getPosition());

Если бы это не было для Vector (const Vector & other) этот пример приведет к синтаксической ошибке.

0
ответ дан 28 November 2019 в 02:32
поделиться
Другие вопросы по тегам:

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