Почему аргумент конструктора копирования const?
-
05-07-2019 - |
Вопрос
Vector(const Vector& other) // Copy constructor
{
x = other.x;
y = other.y;
Почему аргумент является константой?
Решение
Вы получили ответы, в которых упоминается, что ctor не может изменить то, что копируется, - и они правы. Помещение const действительно имеет такой эффект.
Более важно, однако, что временный объект не может привязываться к неконстантной ссылке. Копирующий ctor должен иметь ссылку на const-объект, чтобы иметь возможность делать копии временных объектов.
Другие советы
Поскольку вы не собираетесь изменять аргумент other
внутри ctor-копии, поскольку он является константой.
Когда вы сделали x = other.x
, это по существу означает this- > x = other.x
. Таким образом, вы изменяете только объект этот
, просто копируя значения из переменной other
. Поскольку переменная other
доступна только для чтения, она передается как const-ref. Р>
Традиционный copy-ctor и друзья принимают параметр const & amp;
по причинам, указанным выше. Однако вам также следует поискать move-semantics и ссылки на r-значения (быть частью C ++ 0x, если все пойдет хорошо), чтобы понять, почему и когда вы будете использовать copy-ctors без параметра const & amp;
. Еще одно место, на которое стоит обратить внимание, это реализация интеллектуальных указателей, таких как auto_ptr
(с семантикой передачи владения), где полезны неконстантные параметры.
Чтобы не иметь возможность изменить другой
(случайно)?
когда мы пытаемся скопировать один объект в другой, используя конструктор копирования, нам нужно сохранить исходную копию исходного объекта (который мы копируем), поэтому при передаче объекта мы делаем его постоянным и передаем его как ссылку. р>
Идея конструктора копирования заключается в том, что вы копируете содержимое объекта other
в объект this
. Const существует, чтобы гарантировать, что вы не измените объект other
.
Это не относится к конструктору копирования. В любой функции, если вы не собираетесь изменять внутреннее состояние объекта, объект будет передан как const
.
Vector(const Vector& other)
{
//Since other is const, only public data member and public methods which are `const` can be accessed.
}
Это также может пригодиться, если вы хотите скопировать объект, на который у вас есть только константная ссылка, например
...
const Vector& getPosition();
...
Vector* v = new Vector(getPosition());
Если бы не Vector (const Vector & amp; other)
, в этом примере возникла бы синтаксическая ошибка. Р>